Java StAX 解析器 - 概述



StAX 是一個基於 Java 的 API,用於以類似於 SAX 解析器的方式解析 XML 文件。但與 SAX 解析器不同,StAX 解析器 API 是一個簡單的基於迭代器的 API,它將解析控制權交給客戶端程式。它以只讀正向的方式讀取 XML 文件並將事件儲存在迭代器中。

客戶端可以根據每個事件的事件型別請求他想要訪問的事件。

SAX 和 StAX 解析器之間的區別

以下是 SAX 和 StAX 解析器之間的一些顯著區別:

SAX 解析器 StAX 解析器
基於推送的流解析器 基於拉取的流解析器
無法建立 XML 文件 無法建立 XML 文件
給予客戶端程式較少的解析控制 給予客戶端程式更多的解析控制
不是基於迭代器的 API 基於迭代器的 API
必須實現處理程式類 無需實現任何處理程式類
提供模式驗證 不提供模式驗證

環境設定

為了使用 StAX 解析器,你的應用程式的類路徑中應該包含 **stax.jar**。

StAX 的特性

以下是 StAX API 的特性:

  • 從上到下讀取 XML 文件並識別標記。

  • 按標記出現的順序處理標記。

  • 向解析器報告標記的性質。

  • 根據識別的標記呼叫事件處理程式中的回撥方法。

何時使用 Java StAX 解析器?

你應該在以下情況下使用 StAX 解析器:

  • 你想以線性方式從上到下處理 XML 文件。

  • 文件巢狀不深。

  • 你的 XML 文件非常大。

  • 要解決的問題只涉及 XML 文件的一部分。

  • 你有流資料(資料一旦被解析器看到就可用)。

StAX 的缺點

以下是 StAX 解析器的缺點:

  • 由於它是以只讀正向的方式處理的,我們無法隨機訪問 XML 文件。

  • 不支援 XML 模式驗證。
  • 如果你需要跟蹤解析器已經看到的資料或解析器更改了專案順序的位置,則必須自行編寫程式碼並存儲資料。

XMLEvent 介面

此介面提供 XML 文件所有元件的基本事件表示。事件型別區分每個事件,並相應地檢索資訊。此介面的一些最常用方法如下:

方法 描述
StartElement asStartElement() 從此事件檢索 StartElement 物件。
EndElement asEndElement() 從此事件檢索 EndElement 物件。
Characters asCharacters() 從此事件檢索字元,例如 CDATA、空格等。
int getEventType() 返回此事件的整數程式碼。

XMLEventReader 介面

此介面提供事件迭代器,可用於在解析 XML 文件時迭代發生的事件。一些最常用的方法列在下面:

方法 描述
boolean hasNext() 如果 EventReader 中還有更多事件,則返回 true,否則返回 false。
XMLEvent nextEvent() 返回 EventReader 中的下一個 XMLEvent。
XMLEvent peek() 返回下一個 XMLEvent,而無需從流中讀取它。

XMLEventWriter 介面

此介面透過新增事件來寫入 XML 文件。一些最常用的方法列在下面:

方法 描述
void add(Event event) 將包含元素的事件新增到 XML。
void flush() 將任何快取的事件寫入流。
void close() 關閉與流相關的全部資源。

XMLStreamReader 介面

此介面提供了一種以只讀正向方式有效讀取 XML 事件的方法。其一些方法列在下面:

方法 描述
int next() 用於檢索下一個事件。
boolean hasNext() 用於檢查是否存在更多事件。
String getText() 用於獲取當前解析事件的文字。
String getLocalName() 用於獲取當前事件的本地名稱。

XMLStreamWriter 介面

此介面提供寫入 XML 文件的方法。一些最常用的方法列在下面:

方法 描述
void writeStartDocument() 將 XML 宣告語句新增到輸出流。
void writeStartElement(String localName) 新增具有給定名稱的起始元素。
void writeEndElement(String localName) 新增具有給定名稱的結束元素。
void writeAttribute(String localName, String value) 將具有指定名稱和值的屬性寫入元素。
廣告