使用 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 標記表示為 Elements,它特別使用與屬性相關的方法擴充套件 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() 的閘道器。