標籤:xml dom
DOM概述:
DOM是一種典型的基於XML文檔樹狀結構的解析技術。從概念上看,DOM的解析方式非常容易理解。DOM首先載入XML文檔,並把XML樹狀結構存放到電腦記憶體中做進一步處理。
1.DOM與XML基於樹狀結構的解析模式1.1XML基於樹狀結構的解析模式
XML文檔中的文件類型描述、元素、屬性、處理指示、注釋和常值內容都可以視為狀態樹的節點。雖然從XML文檔本身和XPath的角度來看,節點的含義略有不同,但是,一個XML文檔能夠被看作是按照一定階層分布的節點樹。
當一個XML文檔被以文檔的形式載入到電腦記憶體以後,應用程式就能夠像訪問其他資料對象一樣訪問這個XML文檔,並能夠方便地對文檔做出處理。DOM(Document Object Model)就是這樣一種解析技術的典型代表。
由此可以看出,DOM對XML的處理方式與SAX處理方式完全不同。當SAX解析器處理XML文檔時,xml文檔中的節點逐一被讀取和分析的。而在DOM解析器中,整個XML文檔唄解析器載入,如果被載入的XML文檔含有語法錯誤,DOM解析器在載入階段都就能夠發現並報告錯誤。因此DOM解析器不需要像SAX解析過程那樣記錄處理狀態,解析過程沒有SAX複雜。(事實上,大多數解析器在建立DOM樹的過程都是採用SAX完成的)
DOM相對於SAX在XML文檔內容處理上有比較大的優勢。由於XML文檔已經按照樹狀結構儲存,對於應用程式來說,整個XML文檔總是處於可以隨時訪問的狀態。另外在應用程式中動態修改文檔也十分容易。
DOM相對於SAX也有明顯的不足。同樣是由於XML文檔被完整得存放到電腦記憶體中,計數機需要消耗數倍於原始XML文檔的記憶體才能夠在DOM解析以後處理記憶體中的樹狀結構。當處理大型XML文檔時,DOM會因為記憶體容量消耗過大的原因而使程式效率大受影響。因此,採用DOM方式對應用程式的延展性不利。它通常被用於解析和處理資料量比較少的XML文檔。
1.2 Java DOM編程介面
DOM是由一組抽象化的介面組成。DOM介面定義了DOM編程規範。不同的DOM解析器通過不同的方法實現了這些介面。Node是整個Dom中最基本的資料類型,它代表了一個抽象的節點。XML文檔的DOM樹上的具體節點類型都是由Node類型派生而來。JAXP中的DOM介面可以由中的類圖來表示
1. 如上所述,Node代表了DOM樹中的一個抽象節點。它並沒有一個確定的節點類型。DOM樹中的一個具體節點都是有Node類型派生而來。每一種由Node派生的節點,可以通過測試它的物件類型得到節點類型,也可以由Node的getNodeType()方法獲得。每一個節點還可以通過getNodeName()和getNodeValue()活得節點名和節點值。下表總結了Node介面的子介面的節點名、節點值和節點類型值的基本規律
2. Document
Document 節點代表了整個XML文檔。當DOM解析一個XML文檔以後,由XML形成的DOM節點樹就是一Document對象的形式展現給應用程式的。由於XML文檔的元素、處理指示、注釋等都處於一個XML文檔範圍之內,Document中包含了用於建立元素、屬性、注釋、處理指示等其他節點類型的方法。
Node的normalize()方法提供了XML文檔正規化的一種途徑。當一個Document對象經過normalize()操作以後,相鄰的文本(Text)節點被合并,空文本節點都將被去除。XML文檔中的文本將通過元素、處理指示、注釋和CDATA等加以分隔。
3. Element和Attr
一個Attr對象代表了元素的一個屬性。DOM並不認為屬性節點是整個文檔樹的一部分,因此從DOM的角度看,元素節點的父節點、同胞節點等都是null。屬性節點能夠通過getOwenerElement()方法得到當前屬性所依附的元素。
一個Element對象代表了DOM樹中的一個元素節點。除了在Node中定義的常規方法以外,Element還定義了一組方法用於擷取元素中的屬性、動態地增加一個屬性或者動態刪除一個屬性等方法。
4.Entity 和 EntityReference
Entity代表了一個實體(而非實體描述)。DOM2中的實體節點有以下特點:不能修改實體(實體節點以及後代節點都是唯讀)、實體節點沒有父節點、不能解析名稱控制項首碼。
EntityReference代表了一個實體引用。與實體節點一樣,實體引用節點以及後台節點也是唯讀。EntityReference除了從Node繼承下來的方法以外沒有定義自己專屬的方法。與實體不同的是,實體節點能夠通過getPublicId()和getSystemId()過去公用和系統標識符,而實體引用節點沒有這個能力。
5. Text 和 CDATSection
Text節點用於代表XML文檔中元素和屬性中的常值內容。
CDATSection用於代表XML文檔中的CDATA部分的內容。DOM解析器只能識別CDATA的結尾標記"]]>",並以此作為CDATA的分節符號。相鄰的CDATASection節點不會被Node中的normalize()方法合并。