使用 JAXP API 進行 XML 解析
XML 解析是對 XML 文件的解釋,以便使用合理的構造來操作它們的內容,無論是節點,屬性,文件,名稱空間,還是與這些構造相關的事件。
Java 有一個用於 XML 文件處理的本機 API,稱為 JAXP,或者用於 XML 處理的 Java API 。自 Java 1.4(JAXP v1.1)以來,JAXP 和參考實現已與每個 Java 發行版繫結在一起,並且從那時起已經發展。Java 8 隨 JAXP 1.6 版一起提供。
API 提供了與 XML 文件互動的不同方式,它們是:
- DOM 介面(文件物件模型)
- SAX 介面(XML 的簡單 API)
- StAX 介面(用於 XML 的 Streaming API)
DOM 介面的原理
DOM 介面旨在提供符合 W3C DOM 的解釋 XML 的方式。各種版本的 JAXP 支援各種 DOM 級別的規範(最高階別 3)。
在文件物件模型介面下,XML 文件表示為樹,從文件元素開始。API 的基本型別是 Node
型別,它允許從 Node
導航到它的父節點,它的子節點或它的兄弟節點(雖然,並非所有節點都可以有子節點,例如,Text
節點在樹中是最終的,並且從來沒有孩子)。XML 標記表示為 Element
s,它特別使用與屬性相關的方法擴充套件 Node
。
DOM 介面非常有用,因為它允許將 XML 文件一行解析為樹,並允許輕鬆修改構造的樹(節點新增,抑制,複製……),最後進行序列化(返回磁碟) )修改後。然而,這是有代價的:樹存在於記憶體中,因此,DOM 樹對於大型 XML 文件並不總是實用的。此外,樹的構造並不總是處理 XML 內容的最快方式,特別是如果一個人對 XML 文件的所有部分不感興趣。
SAX 介面的原理
SAX API 是面向事件的 API,用於處理 XML 文件。在此模型下,XML 文件的元件被解釋為事件(例如標籤已開啟,標籤已關閉,遇到文字節點,已遇到評論)。 ..
SAX API 使用推送解析方法,其中 SAX Parser
負責解釋 XML 文件,並呼叫委託( ContentHandler
) 上的方法來處理 XML 文件中發現的任何事件。通常,一個人從不編寫解析器,但是一個人提供了一個處理程式來從 XML 文件中收集所有需要的資訊。
SAX 介面通過僅保留解析器級別的最小必要資料(例如,名稱空間上下文,驗證狀態)來克服 DOM 介面的限制,因此,只有由開發人員負責的 ContentHandler
儲存的資訊是記憶中。權衡的是,沒有辦法用這種方法“回溯到時間/ XML 文件”:雖然 DOM 允許 Node
返回其父級,但在 SAX 中沒有這種可能性。
StAX 介面的原理
StAX API 採用與 SAX API(即事件驅動)處理 XML 類似的方法,唯一非常有意義的區別是 StAX 是拉解析器(其中 SAX 是推送解析器)。在 SAX 中,Parser
處於控制狀態,並在 ContentHandler
上使用回撥。在 Stax 中,你呼叫解析器,並控制何時/如果你想獲取下一個 XML事件。
API 以 XMLStreamReader (或 XMLEventReader ) 開頭,它們是開發人員以迭代器風格方式詢問 nextEvent()
的閘道器。