StAX

XML流APIStreaming API for XML,縮寫StAX)是用於讀寫XML文檔的應用程式接口,起源於Java社群,JSR 173定義了這個API。

傳統上來說,XML的API無外乎是以下兩種:

  • 基於樹的API- 整個文檔以樹的形式被讀入內存,可以被調用程序隨機訪問。
  • 基於事件的API - 應用註冊接收事件,當原XML文檔遇到事體時就會產生這些事件。

兩者皆有優點,前者(例如DOM)允許對文檔進行隨機訪問,而後者(例如SAX)需要較小的內存開銷,並卻通常更快。

這兩個方法可以認為是正好相反。基於樹的API允許無限制的,隨機的訪問和操縱,而基於事件的API是一次性地遍歷源文檔。

StAX被設計為這兩者的一個折中。在StAX中,程序的切入點是表示XML文檔中一個位置的光標。應用程式在需要時向前移動光標,從解析器拉出信息。與基於事件的API(如SAX)將「數據推送」給應用程式不同的是,SAX需要應用程式維持時間間的狀態,以保持文檔內的位置信息。

起源

StAX起源於一些「拉」XML的API,最著名的是XMLPULL, 其作者(Stefan Haustein和Aleksander Ominski)與BEA Systems, 甲骨文公司, Sun, Breeze Factor及James Clark合作編寫了這個規範。

例子

從JSR-173 Specification• Final, V1.0中摘取的例子(以合理使用方式使用)

引用:

下面的Java API顯示了以光標方式讀取XML的主要方法。
// Java 
public interface XMLStreamReader { 
  public int next() throws XMLStreamException; 
  public boolean hasNext() throws XMLStreamException; 
  public String getText(); 
  public String getLocalName(); 
  public String getNamespaceURI(); 
  // ...其他方法隐去
}
寫入的API與讀取API的元素開始和元素結束相對應。
// Java 
public interface XMLStreamWriter { 
  public void writeStartElement(String localName) throws XMLStreamException;
  public void writeEndElement() throws XMLStreamException; 
  public void writeCharacters(String text) throws XMLStreamException; 
  // ...其他方法隐去
}
5.3.1 XMLStreamReader
本例子說明初始化一個輸入工廠,創建閱讀器,并迭代XML文檔中的元素。
XMLInputFactory f = XMLInputFactory.newInstance(); 
XMLStreamReader r = f.createXMLStreamReader(... ); 
while (r.hasNext()) { 
    r.next(); 
}

實現

  • Sun Java Streaming XML Parser 開源。作為J2SE 6的一部分發布
  • JSR-173的參考實現[1]
  • Woodstox[2],開源StAX實現(以LGPL或Apache許可證發布)
  • Aalto[3],超高性能的解析器(GPL或商業許可證)
  • libxml2[4],XML的C解析器和工具(MIT許可證)
  • Expat[5],用C寫的XML解析器函數庫

參見

  • 文檔對象模型,基於樹的XML的API
  • JDOM
  • Dom4j
  • SAX,基於事件的XML的API。
  • JAXB,基於XML解析器(通常是StAX)將XML數據綁定到Java對象上。
  • Apache Axiom,基於StAX的輕量級的XML對象模型,支持滯後構建。
  • XMLPull API
  • kXML 使用XMLPull API的J2ME上的XML解析器

外部連結