Java XML分析技術: StAX, SAX, DOM, DOM4j, JDOM__Java

來源:互聯網
上載者:User
Java 6.0對XML支援的新特性有許多方面。比如StAX、針對XML-Web服務的Java架構(JAX-WS)2.0、針對XML綁定的API(JAXB)2.0、XML數位簽章API,甚至還支援SQL:2003 'XML'資料類型。在這一篇文章中我們將要介紹的是StAX技術,因為它在我們的開發中將被使用地更加頻繁。 

StAX是Streaming API for XML的縮寫,是一種針對XML的流式拉分析API。關於對XML進行分析(或解析)的技術,大家一定都不陌生了。在Java 6.0之前,就已經有四種: 
DOM:Document Object Model SAX:Simple API for XML JDOM:Java-based Document Object Model DOM4J:Document Object Model for Java
關於它們的解析原理,以及效能和優缺點,我會在本文的結尾做一個簡要的介紹。這篇文章中,我們主要說說StAX這種新的解析方式。 

首先我們來搞清楚兩個概念: 推分析 和 拉分析 。 

在程式中訪問和操作XML檔案一般有兩種模型:DOM(文件物件模型)和流模型。它們的優缺點如下: 

引用 DOM優點:允許編輯和更新XML文檔,可以隨機訪問文檔中的資料,可以使用XPath(XML Path Language,是一種從XML文檔中搜尋節點的查詢語言)查詢。 
DOM缺點:需要一次性載入整個文檔到記憶體中,對於大型文檔,會造成效能問題。

引用 流模型優點:對XML檔案的訪問採用流的概念,在任何時候記憶體中只有當前節點,解決了DOM的效能問題。 
流模型缺點:是唯讀,並且只能向前,不能在文檔中執行向後導航操作。

關於什麼是DOM,文章結尾處會有介紹。這裡我們簡單說一下流:它是一個連續的位元組序列,可以理解為不停地從源頭向目標搬運著位元組的特殊對象。 

讓我們回到主題。流模型每次迭代XML文檔中的一個節點,適合於處理較大的文檔,所耗記憶體空間小。它有兩種變體--“推”模型和“拉”模型。 

引用 推模型:就是我們常說的SAX,它是一種靠事件驅動的模型。當它每發現一個節點就引發一個事件,而我們需要編寫這些事件的處理常式。這樣的做法很麻煩,且不靈活。

引用 拉模型:在遍曆文檔時,會把感興趣的部分從讀取器中拉出,不需要引發事件,允許我們選擇性地處理節點。這大大提高了靈活性,以及整體效率。

到此,我們就弄明白了“推分析”和“拉分析”的概念: 

引用 基於流模型中推模型的分析方式稱為推分析;基於流模型中拉模型的分析方式就稱為拉分析。

StAX就是一種拉分析式的XML解析技術。它也支援對XML檔案的產生操作,但是這篇文章裡我們只介紹有關解析的知識。 

從一開始,JAXP(Java API for XML Processing)就提供了兩種方法來處理XML:DOM和SAX。StAX是一種面向流的新方法,最終版本於2004年3月發布,並成為JAXP 1.4(包含在Java 6.0中)的一部分。StAX的實現使用了JWSDP(Java Web Services Development Pack)1.6,並結合了SJSXP(Sun Java System XML Streaming Parser,位於javax.xml.stream.*包中)。 

JWSDP是用來開發Web Services、Web應用程式以及Java應用(主要是XML處理)的開發包。它包含的Java API有: 
JAXP:Java API for XML Processing JAXB:Java Architecture for XML Binding JAX-RPC:Java API for XML-based Remote Procedure Calls JAX-WS:Java API for XML Web Services SAAJ:SOAP with Attachments API for Java JAXR:Java API for XML Registries Web Services Registry

JWSDP的早期版本中還包括: 
Java Servlet JSP:JavaServer Pages JSF:JavaServer Faces

現在,JWSDP已經被GlassFish所替代。 

StAX包括兩套處理XML的API,分別提供了不同程度的抽象。它們是:基於指標的API和基於迭代器的API。 

我們先來瞭解基於指標的API。它把XML作為一個標記(或事件)流來處理,應用程式可以檢查解析器的狀態,獲得解析的上一個標記的資訊,然後再處理下一個標記,依次類推。 

在開始API探索之前,我們首先建立一個名為users.xml的XML文檔用於測試,它的內容如下: 

Xml代碼   <?xml version="1.0" encoding="UTF-8"?>   <company>       <depart title="Develop Group">           <user name="Tom" age="28" gender="male" >Manager</user>           <user name="Lily" age="26" gender="female" />       </depart>       <depart title="Test Group">           <user name="Frank" age="32" gender="male" >Team Leader</user>           <user name="Bob" age="45" gender="male" />           <user name="Kate" age="25" gender="female" />       </depart>   </company>  

可以讓我們使用基於指標的API的介面是javax.xml.stream.XMLStreamReader(很遺憾,你不能直接執行個體化它),要得到它的執行個體,我們需要藉助於javax.xml.stream.XMLInputFactory類。根據JAXP的傳統風格,這裡使用了抽象工廠(Abstract Factory)模式。如果你對這個模式很熟悉的話,就能夠在腦海中想象出我們將要編寫的代碼的大致架構了。 

首先,獲得一個XMLInputFactory的執行個體。方法是: 

Java代碼   XMLInputFactory factory = XMLInputFactory.newInstance();  

或者: 

Java代碼   XMLInputFactory factory = XMLInputFactory.newFactory();  

這兩個方法是等價的,它們都是建立了一個新的執行個體,甚至執行個體的類型都是完全一致的。因為它們的內部實現都是: 

Java代碼   {       return (XMLInputFactory) FactoryFinder.find("javax.xml.stream.XMLInputFactory", "com.sun.xml.internal.stream.XMLInputFactoryImpl");   }  

接下來我們就可以建立XMLStreamReader執行個體了。我們有這樣一組方法可以選擇: 

Java代碼  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.