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(); 
}

 实现 

 Sun Java Streaming XML Parser 开源。作为J2SE 6的一部分发布
 JSR-173的参考实现
 Woodstox，开源StAX实现（以LGPL或Apache许可证发布）
 Aalto，超高性能的解析器（GPL或商业许可证）
 libxml2，XML的C解析器和工具（MIT許可證）
 Expat，用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解析器

 外部链接 
 JSR 173 规范 
 StAX介绍 XML.com, Harold, Elliotte Rusty
 StAX教程
 XMLPull模式关于XML Pull（以及StAX）的设计模式，Aleksander Slominski.
 XMLPull.org
 StAX和Sax的比较
 StAX-Utils提供工具类，便于开发者将StAX集成到现有的XML处理应用中。

Category:Java
Category:应用程序接口