技术中心

这里象征着我们的态度和能力

>使用SAXParser处理XML文档
作者:中国IT实验室    来源:中国IT实验室    发布时间:2012-01-28      浏览次数:6246
分享到:
欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

    在本文中主要就如何用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.

    最后的运行结果是:

4000-880-989
(24小时热线)
联系客服
微信公众号

官方公众号

小程序

©2008-2022 CORPORATION ALL Rights Reserved. 昆明奥远科技有限公司版权所有 滇ICP备09003328号-1 滇公网安备 53011102000818号 增值电信业务经营许可证号:滇B2-20110045
昆明那家网络公司好,新媒体运营,网站优化,网络推广,网站建设,网页设计,网站设计,网站推广,云南网站公司,昆明新媒体公司,云南网红主播,昆明SEO公司,昆明网站建设,昆明网络推广,昆明网站优化,昆明网站推广,红河网站建设,大理网络公司,曲靖网络公司,丽江网站设计,昭通网络公司,保山大数据服务,智慧高速建设,智慧校园服务,云南IDC服务商,网络安全测评,等保测评,网站关键词排名优化服务,服务客户尽超2000余家,一切尽在奥远科技,服务电话:13888956730