999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于StAX中事件迭代器API的XML數(shù)據(jù)解析技術(shù)研究

2008-04-12 00:00:00劉雨瀟冒東奎
現(xiàn)代電子技術(shù) 2008年10期

摘 要:當(dāng)今許多企業(yè)多數(shù)使用DOM(文檔對(duì)象模型)和SAX(XML的簡(jiǎn)單API)處理XML數(shù)據(jù)。DOM的主要缺點(diǎn)是在XML文檔被導(dǎo)航之前必須在內(nèi)存里建立其完整的樹(shù)形結(jié)構(gòu)。為此,處理XML大文檔需要消耗大量?jī)?nèi)存。而SAX的主要缺點(diǎn)在于應(yīng)用程序被動(dòng)地接收解析器生成的事件,因此不能通過(guò)導(dǎo)航隨意瀏覽和修改XML文檔的指定部分。Java EE 5新推出的StAX(Streaming API for XML,XML流式API)很好地解決了上述問(wèn)題。StAX既有SAX的效率,又有DOM強(qiáng)大的功能。介紹StAX這種最新XML數(shù)據(jù)解析技術(shù)的開(kāi)發(fā)背景,分析其解析機(jī)理和技術(shù)內(nèi)涵,并在此基礎(chǔ)之上給出一個(gè)使用基于事件迭代器的API集合解析XML文件的應(yīng)用示例。實(shí)際操作表明StAX為流式處理XML提供了一個(gè)標(biāo)準(zhǔn)、雙向模式的解析器接口,比StAX更簡(jiǎn)單,比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文件的開(kāi)發(fā)者提供一種替代SAX和DOM的API。StAX是一種基于Java的、事件驅(qū)動(dòng)的、采用拉式解析方法的流式API。StAX 允許創(chuàng)建雙向的XML解析器。它速度快、容易編程、占用內(nèi)存少[1]。

StAX是由BEA 公司領(lǐng)頭開(kāi)發(fā)的,同時(shí)得到Sun Microsystems公司的支持。最初以JSR 173(即173號(hào)Java規(guī)范請(qǐng)求)公布,并于2004年3月通過(guò)了Java 社區(qū)過(guò)程(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 語(yǔ)言處理 XML 的最新標(biāo)準(zhǔn),無(wú)論從性能還是可用性上都優(yōu)于DOM 和 SAX。然而,對(duì)這樣一種很有應(yīng)用價(jià)值的新型XML數(shù)據(jù)解析技術(shù)目前國(guó)內(nèi)研究和應(yīng)用較少。為此,本文介紹StAX的開(kāi)發(fā)背景、解析機(jī)理,并在此基礎(chǔ)之上給出一個(gè)應(yīng)用示例。

2 StAX解析機(jī)理

XML流式解析器StAX把XML文件看作一系列的事件流,由應(yīng)用程序控制解析過(guò)程,即應(yīng)用程序從StAX解析器中分離出XML事件進(jìn)行解析處理。StAX的解析機(jī)理見(jiàn)圖1。

StAX包括2種處理 XML 的 API,分別提供不同程度的抽象。一種是基于指針的 API ,他允許應(yīng)用程序把 XML 作為一個(gè)標(biāo)記(或事件)流來(lái)處理;應(yīng)用程序可以檢查解析器的狀態(tài),獲得解析的上一個(gè)標(biāo)記信息,然后再處理下一個(gè)標(biāo)記,依此類推。這是一種低層 API,盡管效率高,但是沒(méi)有提供底層 XML 結(jié)構(gòu)的抽象。其主要API為XMLStreamReader。

圖1 StAX的解析機(jī)理

另一種是較為高級(jí)的基于迭代器的 API ,他允許應(yīng)用程序把 XML 作為一系列事件對(duì)象來(lái)處理,每個(gè)對(duì)象和應(yīng)用程序交換 XML 結(jié)構(gòu)的一部分[2]。應(yīng)用程序只需要確定解析事件的類型,將其轉(zhuǎn)換成對(duì)應(yīng)的具體類型,然后利用其方法獲得屬于該事件的信息。其主要API為XMLEventReader。

不管使用2種StAX API 中的哪一種,都是應(yīng)用程序調(diào)用解析器,而不是相反。通過(guò)保留解析過(guò)程的控制權(quán),可以簡(jiǎn)化調(diào)用代碼,準(zhǔn)確處理預(yù)期的內(nèi)容。

基于指針的API集合和基于事件迭代器的API集合技術(shù)內(nèi)涵都很豐富。受篇幅限制,本文著重介紹后面的示例所要用到的基于事件迭代器API集合的解析原理。然后通過(guò)一個(gè)典型示例演示具體用法。

3 基于事件迭代器的API集合 

顧名思意,事件迭代器API把解析一個(gè)XML文件分為12種事件,將這12種事件封裝成對(duì)象,根據(jù)封裝好的事件對(duì)象中定義的方法處理XML文件。其事件-判斷-類型轉(zhuǎn)換見(jiàn)表1。

表1 事件-判斷-類型轉(zhuǎn)換

其中,EntityDeclaration,NotationDeclaration事件不被單獨(dú)報(bào)告,而是作為DTD事件的一部分。

在事件迭代器API中,用nextEvent()方法返回下一個(gè)事件,用hasNext()方法判斷是否有后繼事件,用getElementText()返回元素內(nèi)容,用close()方法關(guān)閉事件迭代器。事件迭代器解析流程見(jiàn)圖2。事件迭代器API的解析流程:

(1) 用nextEvent()方法返回事件類型;

(2) 用isXXX方法判斷是哪種事件類型;

(3) 根據(jù)事件的類型將事件實(shí)例化為事件對(duì)象;

(4) 調(diào)用事件對(duì)象所定義的方法解析XML文件;

(5) 用hasNext()判斷是否有后繼事件,如果有則重復(fù)第(1)~(4)步;

(6) XML文件解析后用close()方法關(guān)閉事件迭代器。

圖2 事件迭代器API解析流程

4 用StAX解析一個(gè)XML文件

本示例使用基于事件迭代器的API來(lái)解析一個(gè)XML文件。首先用newInstance()方法實(shí)例化一個(gè)工廠并創(chuàng)建一個(gè)XMLEventReader實(shí)例,并給定一個(gè)XML文件的輸入流。然后不斷檢查事件迭代器的狀態(tài),根據(jù)當(dāng)前事件的類型報(bào)告一些信息。XML文件解析從START_DOCUMENT開(kāi)始,一直到END_DOCUMENT結(jié)束,最后關(guān)閉讀取器。該示例的時(shí)序圖見(jiàn)圖3。

示例所用到的order.xml文件:

Birdsong

244

12

21.95

135 Airline Highway

Narragansett

RI

02282

263.40

18.44

[ZK(]8.95[ZK)]

290.79

圖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é) 語(yǔ)

StAX 為流式地處理XML提供了一個(gè)標(biāo)準(zhǔn)、雙向、拉式的解析器接口,他比SAX更簡(jiǎn)單,比DOM管理內(nèi)存更有效。StAX 使開(kāi)發(fā)者能夠按事件解析和修改XML數(shù)據(jù)流,同時(shí)擴(kuò)展了信息模型,允許增加應(yīng)用程序特有的其他東西。

本文主要介紹StAX這種最新XML數(shù)據(jù)解析技術(shù)的開(kāi)發(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) 簡(jiǎn)介[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]魚(yú)雷,李暉,陳娟.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)容請(qǐng)以PDF格式閱讀原文。

主站蜘蛛池模板: 欧美笫一页| 日韩a在线观看免费观看| 国产呦精品一区二区三区网站| 视频在线观看一区二区| 日本成人在线不卡视频| 四虎国产精品永久在线网址| 亚洲天堂成人在线观看| 国产aⅴ无码专区亚洲av综合网| 午夜日韩久久影院| 国产一区二区影院| 国产一在线观看| 色播五月婷婷| 综合色在线| 国产sm重味一区二区三区| 99久久国产自偷自偷免费一区| 国产中文一区a级毛片视频| 亚洲一级毛片免费看| 最新国产精品鲁鲁免费视频| 暴力调教一区二区三区| 国产高清在线精品一区二区三区 | 亚洲自偷自拍另类小说| 亚洲成人黄色在线| 69精品在线观看| 99re经典视频在线| 欧美一区国产| 国产在线精品美女观看| 91久久国产成人免费观看| 日韩不卡高清视频| 白浆视频在线观看| 亚洲男女在线| 免费又爽又刺激高潮网址 | 国产在线麻豆波多野结衣| 久久精品女人天堂aaa| 国产成人91精品免费网址在线| 欧美天堂在线| 国产一级片网址| 国产乱子伦手机在线| 精品视频第一页| 五月激情综合网| 日韩成人高清无码| 亚洲h视频在线| 婷婷激情五月网| 91成人在线观看视频| 日本午夜影院| 狠狠操夜夜爽| 婷婷99视频精品全部在线观看 | 亚洲日韩精品综合在线一区二区| 亚洲精品777| 综合色亚洲| 992tv国产人成在线观看| 国产成人喷潮在线观看| 国产精品999在线| 制服丝袜在线视频香蕉| 中文字幕日韩欧美| 91在线播放免费不卡无毒| 日韩精品亚洲精品第一页| 久久久精品久久久久三级| 免费看美女自慰的网站| 久久久久中文字幕精品视频| 综合色婷婷| 国产剧情国内精品原创| 亚洲午夜18| 亚洲精品男人天堂| 在线看AV天堂| 婷婷六月综合网| 中文字幕久久波多野结衣| 日本国产在线| 国产黄色免费看| 青青青亚洲精品国产| 爱色欧美亚洲综合图区| 欧美一区二区丝袜高跟鞋| 一本色道久久88亚洲综合| 77777亚洲午夜久久多人| 久久精品一卡日本电影| 国产日韩精品欧美一区喷| 亚洲国产成人自拍| 天天躁狠狠躁| 久久福利片| 国产又色又爽又黄| 欧美亚洲国产精品久久蜜芽| 欧美有码在线| 国产成a人片在线播放|