http://www.oracle.com/technology/oramag/oracle/03-sep/o53devxml.html 中阐述了如何有效的解析xml文档。 在本文中主要就如何用SAX解析xml文档进行说明。
要解析的xml片段如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Books>
<Book id="8542f26f-80d4-4b7d-ab25-f80f72a852ef">
<name id="201">
<strings>
<entry>
<key>en_US</key>
<value> thinking in Java</value>
</entry>
</strings>
</name>
<Author>
<entry>
<key>en_US</key>
<value>Tom</value>
</entry>
</Author>
<icon>
<url>think_java.PNG</url>
</icon>
</Book>
...
</Books>
应用程序想从这个xml文档中读出各个book,并且需要提供查询功能,即给定书的id,能够找到作者和书名。
当然,用jdom是很简单的方式,不过如果我们读到的是一个stream,并且比较大,那么我们最好用SAXParser,不需要把整个xml文档装入内存。
首先,我们建立一个Book类,保存book相关的信息。
public class Book {
private String id = null;
private String name = null;
private String author = null;
private Image image = null;
// 一系列的get和set方法。略去
public String toString()
{
return "Book [" + "ID=" + id + ", Name=" + name + ", Author=" + author + "]";
}
}
接下来我们新建一个类BooksSAXHandler,它扩展了DefaultHandler,用于解析xml。SAX解析是以事件为基础的,在这里我们处理三个事件,分别是startElement,endElement以及characters。为了获取一个element里面的text值,我们需要程序知道当前在处理那个结点,但仅仅知道结点也是不够的,因为可以有同名的结点,故此我们引入currentPath,这样可以唯一的定位到要处理的结点。下面给出了解析的方法,注意currentPath的用法。
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentPath.append(qName + "/");
if (qName.equals(ELEMENT_BOOK)) {
book = new Book();
if (attributes.getQName(0).equals(ELEMENT_ID)) {
book.setID(attributes.getValue(ELEMENT_ID));
}
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentPath
.delete(currentPath.lastIndexOf(qName), currentPath.length());
if (qName.equals(ELEMENT_BOOK)) {
booksMap.put(book.getID(), book);
book = null;
}
}
public void characters(char[] ch, int start, int length)
throws SAXException {
if (currentPath.toString().equals(NAME_PATH)) {
book.setName(new String(ch, start, length));
} else if (currentPath.toString().equals(AUTHOR_PATH)) {
book.setAuthor(new String(ch, start, length));
}
}
接下来,我们用javax.xml.parsers.SAXParser来解析这个xml文档,SAXParser需要两个参数,一个是要解析的stream流,另外一个就是DefaultHandler的对象。到此为止,我们已经清楚了解析这个xml的全部过程。在附件中有例子的完整代码。
用户界面是用jface的TableViewer实现的。这里简单介绍一下TableViewer的用法。定义了TableViewer之后,关键需要设置以下三个方法。
tableViewer.setContentProvider(new BooksContentProvider());
tableViewer.setLabelProvider(new BooksLabelProvider());
tableViewer.setInput(getBooks());
其中getBooks()是提供数据的,返回所有数据的列表,在本例返回List<Book>。
BooksLabelProvider需要实现ITableLabelProvider,主要是返回table的对应列的值。其中有两个主要的方法,String getColumnText(Object element, int columnIndex) 以及Image getColumnImage(Object element, int columnIndex)。
在本例中,element对应一个Book对象,getColumnText返回table对应列的文本值,包括Book的ID,Name,Author等。getColumnImage 则返回table对应列的Image,这里对应Book的Image。
最后的运行结果是:
相关推荐
处理XML文档有多种方法,其中SAX(Simple API for XML)是面向事件的解析器,以流式处理方式逐个读取XML文档元素,它不保存整个文档结构,而是按需处理,因此内存占用较低,适合处理大型XML文件。 本篇文章将深入...
在处理XML数据时,SAX(Simple API for XML)是一种常见的解析器,它采用事件驱动模型,以流式方式读取XML文档,降低了内存占用,适用于处理大型XML文件。本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 ...
在处理大型XML文档时,SAX解析器比DOM(Document Object Model)更有效率,因为它不需要将整个文档加载到内存中。SAX解析器逐行读取XML文件,当遇到如开始元素、结束元素、文本等事件时,会触发相应的回调函数,这样...
Java SAX(Simple API for XML)解析器是一种基于事件驱动的XML解析方式,它不将整个XML文档加载到内存中,而是逐行读取,当遇到某个事件(如开始标签、结束标签等)时,会触发相应的事件处理器方法。这种方式节省了...
SAX(Simple API for XML)是XML解析的一种方法,它以事件驱动的方式处理XML文档,非常适合处理大体积的XML文件,因为它不需要一次性加载整个文件到内存,而是逐行读取,因此节省了资源。 **SAX解析XML的基本原理:...
总的来说,使用Pull解析器读取和生成XML文件是一种高效且灵活的方法,尤其适合处理大型XML文档。通过掌握这一技术,开发者可以更好地处理XML数据,提高程序的性能和稳定性。在进行XML操作时,还需注意数据的正确性和...
SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...
总的来说,SAX解析适用于处理大型或内存受限环境下的XML文档。如果你的应用场景更注重于快速、低内存消耗地读取XML,那么SAX解析是一个很好的选择。但在需要对XML文档进行结构化操作或需要随机访问的情况下,可能...
Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...
总的来说,XML解析是Android开发中不可或缺的一部分,理解并熟练掌握这三种解析方式,有助于我们更有效地处理XML数据,提高程序的性能和可维护性。在实际应用中,需要根据XML文件的大小、结构以及对效率和灵活性的...
总结来说,XML是一种强大的数据描述语言,通过DOM和SAX解析,我们可以有效地读取和处理XML文档。DOM适合小规模数据处理,而SAX更适合大型文件。在实际开发中,选择合适的解析方式取决于具体需求和资源限制。
DOM解析器将整个XML文件加载到内存中,形成一个树形结构,可以方便地遍历和修改XML文档的任何部分。然而,由于它需要一次性加载整个文件,对于大文件来说可能会消耗大量内存。 在"ReadXMLDemo"中,使用DOM解析的...
"java解析xml文档的常用方法" Java 解析 XML 文档的常用方法有四种:DOM、SAX、JDOM 和 DOM4J。下面对这四种方法进行详细的介绍: 1. 使用 DOM(JAXP Crimson 解析器) DOM(Document Object Model)是一种以层次...
XML解析器是处理XML文档的核心工具,它读取XML文档并将其转换为程序可以理解的形式。Xerces-J是Apache软件基金会开发的一个高性能、全功能的XML解析器,专门针对Java平台设计。 Xerces-J-bin.2.9.1是Xerces-J的一个...
在Android开发中,XML解析是常见的一种数据处理方式,它帮助我们从XML文件中提取信息。SAX(Simple API for XML)是一种事件驱动的解析器,适用于处理大型XML文档,因为它不需要将整个文档加载到内存中。本篇将详细...
Java解析XML数据主要涉及到...总的来说,SAX解析器是Java处理XML文档的一种高效方式,特别适合处理大文件或资源有限的情况。通过自定义事件处理器,我们可以灵活地解析XML文档中的特定信息,而不必一次性加载整个文档。
SAXParser是基于事件驱动的解析器,适用于处理大型XML文档。它不会一次性加载整个XML文件到内存中,而是逐行读取,当遇到开始标签、结束标签、文本内容等事件时,会触发相应的回调函数。这种方式节省了内存,但需要...
- 使用Java标准库的DOMParser和SAXParser实现XML解析的代码示例。 - JDOM库的导入和使用方法,包括创建XML文档、解析XML文件、修改XML数据等。 - JOM4J库的API介绍和使用示例,展示如何快速读写XML,以及执行XPath...
这种解析方式对于大型XML文档来说非常高效,因为它不需要一次性加载整个文档到内存中。SAX的核心接口是`ContentHandler`,它定义了一系列方法,如`startElement`、`endElement`和`characters`,分别对应XML元素的...
在Android和Java编程中,处理XML文件是常见的任务,而SAX(Simple API for XML)是一种轻量级、事件驱动的XML解析器,它以流式方式读取XML文档,只在需要时解析内容,因此非常适合处理大体积的XML文件。 SAX解析器...