摘 要:當(dāng)今許多企業(yè)多數(shù)使用DOM(文檔對象模型)和SAX(XML的簡單API)處理XML數(shù)據(jù)。DOM的主要缺點(diǎn)是在XML文檔被導(dǎo)航之前必須在內(nèi)存里建立其完整的樹形結(jié)構(gòu)。為此,處理XML大文檔需要消耗大量內(nèi)存。而SAX的主要缺點(diǎn)在于應(yīng)用程序被動(dòng)地接收解析器生成的事件,因此不能通過導(dǎo)航隨意瀏覽和修改XML文檔的指定部分。Java EE 5新推出的StAX(Streaming API for XML,XML流式API)很好地解決了上述問題。StAX既有SAX的效率,又有DOM強(qiáng)大的功能。介紹StAX這種最新XML數(shù)據(jù)解析技術(shù)的開發(fā)背景,分析其解析機(jī)理和技術(shù)內(nèi)涵,并在此基礎(chǔ)之上給出一個(gè)使用基于事件迭代器的API集合解析XML文件的應(yīng)用示例。實(shí)際操作表明StAX為流式處理XML提供了一個(gè)標(biāo)準(zhǔn)、雙向模式的解析器接口,比StAX更簡單,比DOM管理內(nèi)存更有效。
關(guān)鍵詞:StAX;XML;XML解析;DOM
中圖分類號(hào):TP312J 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1004-373X(2008)10-103-03
Study of XML Parsing Technique Based on StAX Iterator API
LIU Yuxiao,MAO Dongkui
(Computer Science and Engineering School,North University for Minorities,Yinchuan,750021,China)
Abstract:Nowadays,DOM and SAX are used for XML data processing in most enterprises.The main disadvantage is that an entire tree structure of a XML document must be created in the memory before it can be navigated.Consumption of a huge memory is needed for processing a big XML document.The Shortcoming of SAX is that applications passively receive the generated events by a parser.As a result,browsing and dealing with specified parts of a XML document are impossible.StAX(Streaming API for XML) introduced by Java EE 5 gives a good answer.StAX has the same efficiency as SAX,as well as the same powerful function as DOM.The development background of StAX,a latest parsing technique for XML data.is covered.The parsing mechanics and technical meaning are analyzed.On this basis, an application example for parsing XML document is given,which uses the StAX API based on the iterator.The practice proves that StAX provided a typical and dual interface for XML,it is more similiar and efficiency than SAX and DOM.
Keywords:StAX; XML;XML parsing;DOM
1 引 言
Java EE 5新推出的StAX(Streaming API for XML,XML流式API)為謀求以較低的內(nèi)存消耗和有限的擴(kuò)展要求做高性能的流式處理和修改XML文件的開發(fā)者提供一種替代SAX和DOM的API。StAX是一種基于Java的、事件驅(qū)動(dòng)的、采用拉式解析方法的流式API。StAX 允許創(chuàng)建雙向的XML解析器。它速度快、容易編程、占用內(nèi)存少[1]。
StAX是由BEA 公司領(lǐng)頭開發(fā)的,同時(shí)得到Sun Microsystems公司的支持。最初以JSR 173(即173號(hào)Java規(guī)范請求)公布,并于2004年3月通過了Java 社區(qū)過程(Java Community Process)的最終投票批準(zhǔn) (http://jcp.org/en/jsr/detail?id=173)。目前,StAX已經(jīng)是Java EE5的組成部分(http://java.sun.com/javaee/5/docs/tutorial/ doc/StAX2.html)。
StAX作為用 Java 語言處理 XML 的最新標(biāo)準(zhǔn),無論從性能還是可用性上都優(yōu)于DOM 和 SAX。然而,對這樣一種很有應(yīng)用價(jià)值的新型XML數(shù)據(jù)解析技術(shù)目前國內(nèi)研究和應(yīng)用較少。為此,本文介紹StAX的開發(fā)背景、解析機(jī)理,并在此基礎(chǔ)之上給出一個(gè)應(yīng)用示例。
2 StAX解析機(jī)理
XML流式解析器StAX把XML文件看作一系列的事件流,由應(yīng)用程序控制解析過程,即應(yīng)用程序從StAX解析器中分離出XML事件進(jìn)行解析處理。StAX的解析機(jī)理見圖1。
StAX包括2種處理 XML 的 API,分別提供不同程度的抽象。一種是基于指針的 API ,他允許應(yīng)用程序把 XML 作為一個(gè)標(biāo)記(或事件)流來處理;應(yīng)用程序可以檢查解析器的狀態(tài),獲得解析的上一個(gè)標(biāo)記信息,然后再處理下一個(gè)標(biāo)記,依此類推。這是一種低層 API,盡管效率高,但是沒有提供底層 XML 結(jié)構(gòu)的抽象。其主要API為XMLStreamReader。
圖1 StAX的解析機(jī)理
另一種是較為高級的基于迭代器的 API ,他允許應(yīng)用程序把 XML 作為一系列事件對象來處理,每個(gè)對象和應(yīng)用程序交換 XML 結(jié)構(gòu)的一部分[2]。應(yīng)用程序只需要確定解析事件的類型,將其轉(zhuǎn)換成對應(yīng)的具體類型,然后利用其方法獲得屬于該事件的信息。其主要API為XMLEventReader。
不管使用2種StAX API 中的哪一種,都是應(yīng)用程序調(diào)用解析器,而不是相反。通過保留解析過程的控制權(quán),可以簡化調(diào)用代碼,準(zhǔn)確處理預(yù)期的內(nèi)容。
基于指針的API集合和基于事件迭代器的API集合技術(shù)內(nèi)涵都很豐富。受篇幅限制,本文著重介紹后面的示例所要用到的基于事件迭代器API集合的解析原理。然后通過一個(gè)典型示例演示具體用法。
3 基于事件迭代器的API集合
顧名思意,事件迭代器API把解析一個(gè)XML文件分為12種事件,將這12種事件封裝成對象,根據(jù)封裝好的事件對象中定義的方法處理XML文件。其事件-判斷-類型轉(zhuǎn)換見表1。
表1 事件-判斷-類型轉(zhuǎn)換
其中,EntityDeclaration,NotationDeclaration事件不被單獨(dú)報(bào)告,而是作為DTD事件的一部分。
在事件迭代器API中,用nextEvent()方法返回下一個(gè)事件,用hasNext()方法判斷是否有后繼事件,用getElementText()返回元素內(nèi)容,用close()方法關(guān)閉事件迭代器。事件迭代器解析流程見圖2。事件迭代器API的解析流程:
(1) 用nextEvent()方法返回事件類型;
(2) 用isXXX方法判斷是哪種事件類型;
(3) 根據(jù)事件的類型將事件實(shí)例化為事件對象;
(4) 調(diào)用事件對象所定義的方法解析XML文件;
(5) 用hasNext()判斷是否有后繼事件,如果有則重復(fù)第(1)~(4)步;
(6) XML文件解析后用close()方法關(guān)閉事件迭代器。
圖2 事件迭代器API解析流程
4 用StAX解析一個(gè)XML文件
本示例使用基于事件迭代器的API來解析一個(gè)XML文件。首先用newInstance()方法實(shí)例化一個(gè)工廠并創(chuàng)建一個(gè)XMLEventReader實(shí)例,并給定一個(gè)XML文件的輸入流。然后不斷檢查事件迭代器的狀態(tài),根據(jù)當(dāng)前事件的類型報(bào)告一些信息。XML文件解析從START_DOCUMENT開始,一直到END_DOCUMENT結(jié)束,最后關(guān)閉讀取器。該示例的時(shí)序圖見圖3。
示例所用到的order.xml文件:
[ZK(]
圖3 示例的時(shí)序圖
示例程序的關(guān)鍵代碼:
XMLInputFactory f = XMLInputFactory.newInstance()
f.setProperty(“javax.xml.stream.supportDTD”,true)[JY]/*支持DTD */
InputStream input=new FileInputStream(new File(“XML文件所在位置”));[JY]/*輸入XML文件*/
XMLEventReader r = f.createXMLEventReader()
try{
while(r.hasNext()){[JY]/*是否有后繼事件 */
XMLEvent event = r.nextEvent();
If(event.isStartDocument()){ [JY]/*判斷事件類型 */
StartDocument SD = (StartDocument)event;[JY] /*事件類型轉(zhuǎn)換 */
System.out.println(SD.getVersion());
}
If(event.isStratElement()){ [JY]/*判斷事件類型 */
StartElement SE = event.asStartElement();[JY]/*事件類型轉(zhuǎn)換 */
System.out.println(SE.getName());
}
………………………..
If(event.isEndDocument()){ [JY]/*判斷事件類型 */
EndDocument ED = (EndDocument)event;[JY]/*事件類型轉(zhuǎn)換 */
}
}
}
Finally{
r.close();[JY]/*關(guān)閉事件迭代器 */
}
其輸出結(jié)果如下所示:
1.0
{http://ns.cafeconleche.org/Orders/}Order
{http://ns.cafeconleche.org/Orders/}product
{http://ns.cafeconleche.org/Orders/}Name
Birdsong
{http://ns.cafeconleche.org/Orders/}Name
……………………………………
{http://ns.cafeconleche.org/Orders/}Total
290.79
{http://ns.cafeconleche.org/Orders/}Total
{http://ns.cafeconleche.org/Orders/}Order
5 結(jié) 語
StAX 為流式地處理XML提供了一個(gè)標(biāo)準(zhǔn)、雙向、拉式的解析器接口,他比SAX更簡單,比DOM管理內(nèi)存更有效。StAX 使開發(fā)者能夠按事件解析和修改XML數(shù)據(jù)流,同時(shí)擴(kuò)展了信息模型,允許增加應(yīng)用程序特有的其他東西。
本文主要介紹StAX這種最新XML數(shù)據(jù)解析技術(shù)的開發(fā)背景、解析機(jī)理。受篇幅限制,只給出一個(gè)用基于事件迭代器的StAX API解析XML文件的典型使用方式。由于StAX的技術(shù)內(nèi)涵豐富,功能很多,較深入的應(yīng)用研究尚待繼續(xù)。
參 考 文 獻(xiàn)
[1]Eric Jendrock.The Java EE 5 Tutorial for Sun Java System Application Server Platform[EB/OL].http://java.sun.com/javaee/5/docs/tutorial/doc.2007-02[2007-07].
[2]Peter Nehrer.使用StAX解析XML,第1部分:Streaming API for XML (StAX) 簡介[EB/OL].http://www.ibm.com/developerworks/cn/xml/x-stax1.html.(2007-03-02)[2007-07].
[3]Elliotte Rusty Harold.An Introduction to StAX[ EB/OL ].http://www.xml.com/pub/a/2003/09/17/StAX.html.(2003-09-17)[2007-07].
[4]魚雷,李暉,陳娟.VTD-XML解析技術(shù)研究[J].現(xiàn)代電子技術(shù),2006,29(21):72-74.
[5]張忠平.XML文檔相似性度量方法研究[J].現(xiàn)代電子技術(shù),2007,30(4):165-168.
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。