`

使用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。


最后的运行结果是:



  • 大小: 13.5 KB
分享到:
评论

相关推荐

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

    是属于一析种xml格式规范,学用于更更新数据的网站,例如博客,文章,新闻,音乐或视频的网站上,这些网站会提供用 类。户让阅网站所发布的RSS,且可让用户自行决定想要接收的信息

    SAXParser-用SAX读取大于100M的xml文件(java)

    压缩包里面有两个文件:SAX.java和SAXparse.java 用来解析大于100M的xml文件,SAX读取xml不同于DOM方式,DOM方式在解析xml前需要全部加载xml文件,当xml文件很大时,就会出现内存不足的问题,而SAX则是逐行读取xml...

    QT使用SAX读取xml高效-快速.rar

    QT使用SAX读取xml高效-快速.rar SAX(Simple API for XML) 如果你只想读取并显示整个XML文档,那么SAX是很好的选择,因为它提供了比DOM更简单的接口,并且它不需要将整个XML文档一次性读入内存,这样便可以用来读取...

    xml入门教程/xml入门教程

    XSLT,是用于对XML进行文档格式转换,把一个XML文档转换成另一种格式的XML文档,但是其中内容是不变的。 &2.DTD(Document Type Difinition DTD文档是用于规定XML文档的结构。只有结构符合所引用的DTD文件的XML文件...

    使用SAXParser(SAXParserFactory.newInstance())验证XML文件格式---XSD

    NULL 博文链接:https://wenhai.iteye.com/blog/563416

    基于Java的XML解析与反射设计模式.doc

    xstream也有其欠缺的地方,当xml过 大时用xstream解析就略显笨重,saxparser可以解决这个问题,saxparser在处理xml时 非常类似于流媒体的方式,分析能够立刻开始,而不是等待所有的数据被处理。而且程 序只是在读取...

    android SaxParser 解析 CDATA

    android 使用saxparser 解析&lt;![CDATA[ ]]&gt;标签数据。 见附件实例

    XMLParser:使用 SAX 验证处理来自 XML 文件的客户和订单统计信息

    XML解析器 使用 SAX 验证处理来自 XML 文件的客户和订单统计信息

    SaxParser1.rar_Parser_xml 传输

    很好用的工具,可以将XML文件通过管道方式传输试试吧 相信对你有帮助

    xml文件sax解析类

    xml 解析 SAXParserFactory SAXParser

    saxparser.jar

    org.apache.xerces.parsers.SAXParser.jar

    android 之xml解析大全

    总结android四种解析文件方法 SAXParser Document XMLResource VTDGen

    SaxParser.java

    Sax解析bean示例

    xml-parser解析

    android中常用的xml解析方式,这里用的是SaxParser解析方式。有点是不用完全加载完文件就可以解析、、速度相对快!

    RSS阅读器(XML文件解析)

    一个很方便大家学习RSS,如何使用SAX进行解析XML文件的小项目,也很实用~本项目在博客上有相应的解析,方便大家理解。。。

    sax解析文件,流解析

    得到xml文件对应的资源,可以是xml的输入流,文件和uri 得到SAX解析工厂(SAXParserFactory) 由解析工厂生产一个SAX解析器(SAXParser) 传入输入流和handler给解析器,调用parse()解析防止解析文件过大ooc溢出

    SAXParse.rar

    SAX包文件,可以直接进行xml的解析,需要导入包才可以使用,SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,...

    Android与Internet接轨案例源代码

    8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的应用 8.15 手机下载看3gp影片——Runnable混搭SurfaceView 8.16 访问网站LoginAPI——远程服务器验证程序运行权限 8.17...

    stax2-api-3.1.4.jar

    实现了特殊的XML验证,一般来说使用SAXParser来读入XML文件再进行验证,但是这里使 用了边写边验证的功能,如果是不合法的写入就会失败,所以只要写完XML肯定就是合法的。这也 是Stax2 API提供的功能 java转换...

Global site tag (gtag.js) - Google Analytics