`
huiqinbo
  • 浏览: 344808 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用SAXParser处理xml文档[回钦波祥说xml的解析]

    博客分类:
  • xml
阅读更多

使用SAXParser处理xml文档

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。


最后的运行结果是:



分享到:
评论

相关推荐

    使用SAXParser处理xml文档

    处理XML文档有多种方法,其中SAX(Simple API for XML)是面向事件的解析器,以流式处理方式逐个读取XML文档元素,它不保存整个文档结构,而是按需处理,因此内存占用较低,适合处理大型XML文件。 本篇文章将深入...

    Servlet利用SAX解析XML文档

    在处理XML数据时,SAX(Simple API for XML)是一种常见的解析器,它采用事件驱动模型,以流式方式读取XML文档,降低了内存占用,适用于处理大型XML文件。本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 ...

    移动RSS阅读器利用saxparser解析xml

    在处理大型XML文档时,SAX解析器比DOM(Document Object Model)更有效率,因为它不需要将整个文档加载到内存中。SAX解析器逐行读取XML文件,当遇到如开始元素、结束元素、文本等事件时,会触发相应的回调函数,这样...

    Java SAX解析Xml文档Demo

    Java SAX(Simple API for XML)解析器是一种基于事件驱动的XML解析方式,它不将整个XML文档加载到内存中,而是逐行读取,当遇到某个事件(如开始标签、结束标签等)时,会触发相应的事件处理器方法。这种方式节省了...

    Sax解析XML文件解析

    SAX(Simple API for XML)是XML解析的一种方法,它以事件驱动的方式处理XML文档,非常适合处理大体积的XML文件,因为它不需要一次性加载整个文件到内存,而是逐行读取,因此节省了资源。 **SAX解析XML的基本原理:...

    使用Pull解析器读取XML文件和生成XML文件

    总的来说,使用Pull解析器读取和生成XML文件是一种高效且灵活的方法,尤其适合处理大型XML文档。通过掌握这一技术,开发者可以更好地处理XML数据,提高程序的性能和稳定性。在进行XML操作时,还需注意数据的正确性和...

    sax解析xml本地读取xml

    SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...

    SAX对xml文档进行解析

    总的来说,SAX解析适用于处理大型或内存受限环境下的XML文档。如果你的应用场景更注重于快速、低内存消耗地读取XML,那么SAX解析是一个很好的选择。但在需要对XML文档进行结构化操作或需要随机访问的情况下,可能...

    javaSAX方式解析xml文档

    Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...

    xml的解析文档

    总的来说,XML解析是Android开发中不可或缺的一部分,理解并熟练掌握这三种解析方式,有助于我们更有效地处理XML数据,提高程序的性能和可维护性。在实际应用中,需要根据XML文件的大小、结构以及对效率和灵活性的...

    关于解析xml的一些demo

    总结来说,XML是一种强大的数据描述语言,通过DOM和SAX解析,我们可以有效地读取和处理XML文档。DOM适合小规模数据处理,而SAX更适合大型文件。在实际开发中,选择合适的解析方式取决于具体需求和资源限制。

    android下解析xml文件的demo

    DOM解析器将整个XML文件加载到内存中,形成一个树形结构,可以方便地遍历和修改XML文档的任何部分。然而,由于它需要一次性加载整个文件,对于大文件来说可能会消耗大量内存。 在"ReadXMLDemo"中,使用DOM解析的...

    java解析xml文档的常用方法

    "java解析xml文档的常用方法" Java 解析 XML 文档的常用方法有四种:DOM、SAX、JDOM 和 DOM4J。下面对这四种方法进行详细的介绍: 1. 使用 DOM(JAXP Crimson 解析器) DOM(Document Object Model)是一种以层次...

    XML解析器————

    XML解析器是处理XML文档的核心工具,它读取XML文档并将其转换为程序可以理解的形式。Xerces-J是Apache软件基金会开发的一个高性能、全功能的XML解析器,专门针对Java平台设计。 Xerces-J-bin.2.9.1是Xerces-J的一个...

    android SaxParser 解析 CDATA

    在Android开发中,XML解析是常见的一种数据处理方式,它帮助我们从XML文件中提取信息。SAX(Simple API for XML)是一种事件驱动的解析器,适用于处理大型XML文档,因为它不需要将整个文档加载到内存中。本篇将详细...

    java解析xml数据---sax解析器

    Java解析XML数据主要涉及到...总的来说,SAX解析器是Java处理XML文档的一种高效方式,特别适合处理大文件或资源有限的情况。通过自定义事件处理器,我们可以灵活地解析XML文档中的特定信息,而不必一次性加载整个文档。

    android 之xml解析大全

    SAXParser是基于事件驱动的解析器,适用于处理大型XML文档。它不会一次性加载整个XML文件到内存中,而是逐行读取,当遇到开始标签、结束标签、文本内容等事件时,会触发相应的回调函数。这种方式节省了内存,但需要...

    XML-java.rar_XML SAX_sax_sax xml_sax 解析 xml_xml using dom

    - 使用Java标准库的DOMParser和SAXParser实现XML解析的代码示例。 - JDOM库的导入和使用方法,包括创建XML文档、解析XML文件、修改XML数据等。 - JOM4J库的API介绍和使用示例,展示如何快速读写XML,以及执行XPath...

    使用Sax技术读XML文档:SaxReaderXML.rar

    这种解析方式对于大型XML文档来说非常高效,因为它不需要一次性加载整个文档到内存中。SAX的核心接口是`ContentHandler`,它定义了一系列方法,如`startElement`、`endElement`和`characters`,分别对应XML元素的...

    Sax解析xml文件

    在Android和Java编程中,处理XML文件是常见的任务,而SAX(Simple API for XML)是一种轻量级、事件驱动的XML解析器,它以流式方式读取XML文档,只在需要时解析内容,因此非常适合处理大体积的XML文件。 SAX解析器...

Global site tag (gtag.js) - Google Analytics