StAX
XML流API(Streaming 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();
}
實現
參見
- 文檔對象模型,基於樹的XML的API
- JDOM
- Dom4j
- SAX,基於事件的XML的API。
- JAXB,基於XML解析器(通常是StAX)將XML數據綁定到Java對象上。
- Apache Axiom,基於StAX的輕量級的XML對象模型,支持滯後構建。
- XMLPull API
- kXML 使用XMLPull API的J2ME上的XML解析器
外部連結
- JSR 173 規範(頁面存檔備份,存於網際網路檔案館)
- StAX介紹(頁面存檔備份,存於網際網路檔案館) XML.com, Harold, Elliotte Rusty
- StAX教程
- XMLPull模式關於XML Pull(以及StAX)的設計模式,Aleksander Slominski.
- XMLPull.org(頁面存檔備份,存於網際網路檔案館)
- StAX和Sax的比較(頁面存檔備份,存於網際網路檔案館)
- StAX-Utils提供工具類,便於開發者將StAX集成到現有的XML處理應用中。