使用SAXParser处理XML文档

2016-02-19 19:01 6 1 收藏

下面是个超简单的使用SAXParser处理XML文档教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

【 tulaoshi.com - Web开发 】

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

throws SAXException { 

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

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 { 

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

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。

  最后的运行结果是:

来源:http://www.tulaoshi.com/n/20160219/1619812.html

延伸阅读
标签: PHP
下面是通过createNode()函数,添加商品, 然后显示添加后的结果 <?xml version="1.0" encoding="GB2312" ?><shop> <name>华联</name> <address>北京长安街-9999号</address> <desc>连锁超市</desc> <telphone>123456789</telphone> <cat id="food"> <goods id...
标签: Delphi
  使用xml broker, 是delphi 内置的。例:    unit ShowXML;    interface    uses Classes HTTPApp Db DbClient Midas    XMLBrokr WebComp MidItems;    type    TCustomShowXMLButton = class(TXMLButton IScriptComponent)    protected    XMLMe...
标签: PHP
搞了一天还是这个好( pear ,XML_parse, XML_RSS) PHP PEAR就提供一个 RSS 解析类,方便从用户提供的RSS中,获得相应的信息。     需求    下载XML_RSS: http://pear.php.net/package/XML_RSS    XML_Parser      http://pear.php.net/package/XML_P...
标签: Web开发
XML文档因为其固有的描述性特性而趋向于变得很罗嗦。其结果是文档会由于被描述的数据增多而变得很长,而这种很大的文档会在需要同其他实体进行交换时出现问题。和其他文档(比如普通文本文件(flat file)或者Electronic Data Interchange (EDI))比起来XML文档就显得特别冗长。为了举例说明这个概念,让我们看看以下这个普通文本文件: John...
标签: Web开发
    计算机世界尽管现在越来越多地试图使用unicode这一世界语来说话,但还是存在着gb2312,shift-jis这样的方言,使用MSXML DOM就会清楚地体会到方言的不便。     我想将下面这个文本文档直接存为转换成xml,是否OK,答案是NG(No Good) strXML="?xml version=""1.0"" encoding=""GB2312""?XML这里是一些编...

经验教程

185

收藏

78
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部