XML文件常見解析技術介紹

引言

XML的出現給分佈式計算領域帶來了重大影響,其力量源於它的數據獨立性[1].XML是純數據描述,與編程語言、操作系統或傳輸協議無關,從而將數據從以代碼爲中心的基礎結構所產生的約束中解放出來,讓數據能夠在Web上更自由的流通。

然而XML本身只是以純文本對數據進行編碼的一種格式,要想利用XML,或者說利用XML文件中所編碼的數據,必須先將數據從純文本中解析出來,因此,必須有一個能夠識別XML文檔中信息的解析器,用來解釋XML文檔並提取其中的數據。然而,根據數據提取的不同需求,又存在着多種解析方式,不同的解析方式有着各自的優缺點和適用環境。選擇合適的XML解析技術能夠有效提升應用系統的整體性能,因此,瞭解和區分各種不同的XML解析技術就顯得尤爲重要。

 

2  XML解析技術分析

    所有的XML處理都從解析開始,無論是使用XSLTJava語言,第一步都是要讀入XML文件,解碼結構和檢索信息等等,這就是解析,即把代表XML文檔的一個無結構的字符序列轉換爲滿足XML語法的結構化組件的過程。

 

2.1 XML解析技術的分類

    根據從XML中獲取數據的簡易性,性能和最終所得到的數據模型的不同,XML解析技術大致可分爲以下四類:

    1)面向文檔的流式解析;

    2)面向文檔的對象式解析;

    3)面向文檔的指針式解析;

    4)面向應用的對象式解析;

這四類解析技術分別處於不同的抽象層次,適用於不同的應用場景,有着各自的優缺點。針對具體的應用需求,選擇合適的解析技術,往往能夠減少內存消耗,縮短處理時間,更方便地獲取數據,提高應用系統的整體性能。

 

2.2 面向文檔的流式解析技術

    流式解析是一種基於事件的解析過程,解析器順序讀取XML文檔,產生一個對應的事件流,並向事件處理程序發送所捕獲的各種事件,如元素開始和元素結束等,而事件處理程序則通過不同的方法處理這些事件。

   流式解析是將XML文檔作爲一個數據流來處理,因此,它具有類似於流媒體的優點,能夠立即開始讀取數據,而不是等待所有的數據被處理。而且,由於應用程序只是在讀取數據時檢查數據,不需要將整個文檔一次加載到內存中,使得在處理大型文檔時具有較好的時間和空間上的效率。然而效率的代價是易用性的降低,流式解析編程較爲複雜,程序員需要負責更多的操作。並且由於應用程序沒有以任何方式存儲數據,所以使得更改數據或在數據流中往後移是不可能的。再加上它的單遍解析特性,意味着它也不支持隨機訪問。

  流式解析又分爲兩種解析方式:推式解析(SAX)和拉式解析(StAX)。這兩種方式的主要區別在於是由解析器還是應用程序控制讀循環(讀入文件的循環)。

 

2.2.1 推式解析(SAX解析技術)

SAXSimple API for XML)解析技術就是一種推式解析,在這種解析方式中,解析器控制着讀循環,在文檔結束之前控制權不會返回給應用程序[3].解析器通過回調的方式進行數據處理。。SAX最初是爲Java而定義的,但也可以用於PythonPerlC++等其它語言。

SAX中的核心事件處理程序是一個實現了ContentHandler接口的類。此接口中定義了處理與XML文檔本身關聯的事件的方法,如 startDocumentendDocumentstartElementendElementCharacters

 

SAX解析技術具有所有流式解析技術的優點和缺點,但是由於在整個解析過程中,解析器掌握着控制權直到文檔結束,應用程序很難在獲得所需的部分數據後停止解析過程(可以通過拋出異常的方式終止解析過程,但較爲複雜,而且終止後也無法繼續解析過程),因此產生了由應用程序掌握控制權的拉式解析方式。

 

2.2.2 拉式解析(StAX解析技術)

      StAXStreaming API for XML)解析技術是一種拉式解析,在這種解析方式中,應用程序控制着讀循環。循環中,應用程序負責反覆調用解析器獲得下一個事件,直到文檔結束。通過保留解析過程的控制權,可以簡化調用代碼來準確地處理它預期的內容,並且可隨時停止解析。此外,由於該方式沒有基於處理程序回調,應用程序也不需要像SAX中那樣模擬解析器的狀態。

       StAX針對同樣的XML文檔所獲得事件類型和SAX基本相同,但是StAX包含了兩套處理XMLAPI:基於指針的API和基於迭代器的API,分別提供了不同程度的抽象[5].

StAX也是用Java定義的,其StAX1.020043月發佈,並且成爲了JSR-173 規範,最新版本爲20066月發佈的StAX1.2.StAX作爲用Java語言處理XML的最新標準,比早期出現的XPP Xml Pull Parser)拉式解析器功能更爲強大,也得到了更爲廣泛的應用。

2.3 面向文檔的對象式解析技術

       由於流式解析方式固有的無法更改數據和不支持隨機訪問特性,尤其是沒有對XML文檔的結構建模,使得應用程序很難對XML文檔進行搜索、修改、添加和刪除等操作。爲了解決這些問題,產生了面向文檔的對象式解析技術——DOM.

DOMDocument Object Model)是用與平臺和語言無關的方式對XML文檔進行建模的官方W3C標準[6],其目標是提供一個可以通用於各種程序語言、操作系統和應用程序的接口。

DOM作爲一種對象式解析技術,定義了層次化對象模型來表示XML文檔。即爲XML語法中的每個概念(如元素,屬性,實體,文檔等)定義對應的類,而解析器在讀入XML文檔的時候,會建立XML語法和類之間的一一映射。實際上,DOM的層次化對象模型是一個樹形結構,它將一個XML文檔看作一棵節點樹,每個節點代表一個XML文檔中的元素。DOM的基本節點對象有5[1]:(1Document對象:是樹的最高節點,也是對整個文檔操作的入口;(2ElementAttr對象:對文檔中元素和元素屬性的映射;(3Text對象:作爲ElementAttr對象的子節點,代表了元素或屬性的文本內容;(4NodeList對象:對節點按指定的方式進行遍歷。

利用DOM在內存中建立的完整的XML文檔的樹形結構,開發人員就可以方便的對XML文檔進行一系列操作,如遍歷、增加、刪除、修改文檔內容等,且具有良好的導航能力。同時DOM所具有的對象特性也非常便於面向對象編程。然而,由於DOM在使用數據前需要完整的遍歷XML文檔,在內存中構建樹形結構表示,因此需要消耗大量的內存,尤其是對於大型文檔,性能下降的很快。而且必須一次解析整個XML文檔,不可能只做部分解析,當只關注XML文檔的小部分數據時,效率很低。

由於DOM是與語言無關的,當DOM接口進入指定語言的數據結構時,會產生不必要的複雜性,無法利用語言本身的優勢。因此出現了許多與DOM類似的針對特定語言的對象模型。如JDOM就是針對Java的特定文檔對象模型,JDOM使用具體類而不使用接口,簡化了API,並在API中大量使用了Java集合類。DOM4J則是JDOM的一種智能分支,它提供了對XPathXML Schema的支持,並且通過DOM4J API和標準DOM接口使其具有並行訪問功能[5].它們都屬於面向文檔的對象式解析技術。

2.4 面向文檔的指針式解析技術

       前面提到的面向文檔的流式解析效率較高,但易用性差,而對象式解析易用性強,卻效率較低,這兩種方式似乎處於兩個極端。其效率問題主要在於兩種方式都是提取解析模式,即解析時,提取一部分源文件,一般來說是一個字符串,然後在內存中進行解析構建。這種解析模式註定了需要大量的創建和銷燬對象,而且還存在更新效率問題,在DOM中(SAX並不支持更新),每一次改動都需要將DOM模型重新完整的解析成XML字符串,原文件並沒有被利用,即DOM並不支持增量更新。爲了解決這些問題,提出了一種較新穎的指針式解析技術,即VTD-XML.

      VTD-XML是一種無提取的XML解析方法,它較好的解決了DOM佔用內存過大的缺點,並且還提供了快速的解析與遍歷、對XPath的支持和增量更新等特性。VTD-XML是一個開源項目,目前有JavaC兩種平臺支持,第一個版本是20046月發佈的VTD-XML0.5,其VTD- XML1.0版本於200510月發佈,最新的版本爲200710月發佈的VTD-XML2.2.

       VTDVirtual Token Descriptor,虛擬令牌描述符)是一個64bits長度的數值類型,記錄了每個元素的起始位置,長度,深度以及令牌的類型等信息,如圖3所示。64bits固定長度使得可以用數組這種高效的結構來組織VTD,大幅提高性能。VTD是實現無提取解析的關鍵,它類似於XML文檔中元素的指針,通過它可以快速定位到某個元素。

爲了實現無提取這個目的,VTD-XML將原XML文件原封不動的以二進制的方式讀進內存,不做解碼,然後在這個比特數組上解析每個元素的位置並把一些信息,如XML令牌的開始偏移量、長度、深度和令牌類型,記錄下來,保存爲VTD數組,之後的遍歷操作便可在VTD數組上進行。如果需要提取XML內容,就查找VTD數組,利用VTD記錄中的位置等信息在原始比特數組上進行解碼並返回字符串。

        而且VTD-XML還可以高效的實現增量更新,例如,如果想在一個大型XML文檔中找出一個節點元素並刪除它,那麼只需要找到這個元素的VTD,將這個VTDVTD數組中刪除,然後再利用所有的VTD寫出到另一個二進制數組中就可以了,因爲刪除的VTD標明瞭要刪除的元素的位置,所以在新寫入的二進制數組中就不會出現這段元素了。用VTD寫入新的二進制數組的過程實際上就是一個二進制數組的拷貝過程,其效率是非常高的[2].

       由此可見,VTD很好的解決了前兩種解析方式的缺點,通過其巧妙的設計使得在解析XML文檔時內存佔用少,效率高,並且還能夠實現XML文檔的快速解析與遍歷、提供對XPath的支持。VTD的出現是XML解析技術的一大進步,會對XML解析技術的發展產生巨大影響。

2.5 面向應用的對象式解析技術

       前面所談到的三種解析技術都是從XML的角度來處理文檔和建立模型,這對於主要關心文檔的XML結構的應用程序來說是適用的,但是有很多應用程序僅僅將XML作爲數據交換的媒介,它們更關心的是文檔數據本身。此時,面向應用的對象式解析(或稱爲XML數據綁定)可以使應用程序在很大程度上忽略XML文檔的實際結構,而直接使用文檔的數據內容。

數據綁定是指將數據從一些存儲媒介(如XML文檔、文本文件和數據庫)中取出,並通過應用程序表示這些數據的過程,即把數據綁定到虛擬機能夠理解並且可以操作的某種內存中的結構[9].數據綁定並不是一個新鮮的概念,其在關係數據庫上早已得到了廣泛的應用,如Hibernate就是針對數據庫的輕量級數據綁定框架。而針對XML數據綁定的Castor框架在2000年就已經出現,目前已經涌現出了許多類似的框架,如JBindJAXBJiBXQuickZeus等。

       其中JAXBJava Architecture for XML Binding)是一個處於不斷發展中的應用於Java平臺的數據綁定框架,提供了一套在XML文檔和Java對象之間自動映射的API,符合JSR31——XML數據綁定規範(XML Data Binding Specification)。

如圖4,顯示了數據綁定在數據庫和XML文檔中的應用。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章