使用SAXParser处理XML文档

开发 后端
本文讲述了使用SAXParser处理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。

最后的运行结果是:

【编辑推荐】

  1. 在ASP.NET中使用Treeview控件和XML
  2. JavaScript解析XML的方法总结
  3. 使用 XStream 把 Java 对象序列化为 XML
责任编辑:杨鹏飞 来源: javaeye
相关推荐

2009-06-22 14:26:12

ScalaXML对象

2009-06-10 21:51:42

JavaScript XMLFirefox

2009-08-12 16:46:22

C#读取XML文档

2009-09-16 15:41:45

LINQ查询XML文档

2009-09-16 16:55:07

LINQ to XML

2009-09-16 15:53:49

Linq创建xml文档

2009-09-16 15:48:05

Linq修改XML文档

2010-09-09 13:55:47

XML DOM

2010-09-28 10:03:15

DOM文档对象模型

2009-09-04 14:14:55

C#文档

2012-06-27 09:45:41

ibmdw

2009-08-18 17:08:50

C#编写XML文档

2009-08-24 17:24:28

C#创建XML文档

2011-07-25 16:31:51

iOS XML 文件

2009-01-04 16:58:48

LINQ to XMLLINQXML

2010-09-28 11:03:19

XML DOM

2009-08-24 17:46:54

C#创建XML文档

2009-08-12 15:26:38

C#读取XML文档

2009-12-02 13:07:27

PHP XMLRead

2009-02-27 17:15:05

XMLDOMXPath
点赞
收藏

51CTO技术栈公众号