Streaming API for XML (StAX) is an application programming interface (API) to read and write XML documents, originating from the Java programming language community.

Traditionally, XML APIs are either:

  • DOM based - the entire document is read into memory as a tree structure for random access by the calling application
  • event based - the application registers to receive events as entities are encountered within the source document.

Both have advantages: DOM, for example, allows for random access to the document, and SAX has a small memory footprint and is typically much faster.

These two access metaphors can be thought of as polar opposites. A tree based API allows unlimited, random access and manipulation, while an event based API is a 'one shot' pass through the source document.

StAX was designed as a median between these two opposites. In the StAX metaphor, the programmatic entry point is a cursor that represents a point within the document. The application moves the cursor forward - 'pulling' the information from the parser as it needs. This is different from an event based API - such as SAX - which 'pushes' data to the application - requiring the application to maintain state between events as necessary to keep track of location within the document.


StAX has its roots in a number of incompatible pull APIs for XML, most notably , the authors of which (Stefan Haustein and Aleksander Slominski) collaborated with, amongst others, BEA Systems, Oracle, Sun and James Clark.


From JSR-173 Specification• Final, V1.0 (used under fair use).


The following Java API shows the main methods for reading XML in the cursor approach.
public interface XMLStreamReader {     public int next() throws XMLStreamException;     public boolean hasNext() throws XMLStreamException;     public String getText();     public String getLocalName();     public String getNamespaceURI();     // ...other methods not shown }
The writing side of the API has methods that correspond to the reading side for “StartElement” and “EndElement” event types.
public interface XMLStreamWriter {     public void writeStartElement(String localName) throws XMLStreamException;    public void writeEndElement() throws XMLStreamException;     public void writeCharacters(String text) throws XMLStreamException;     // ...other methods not shown }
5.3.1 XMLStreamReader
This example illustrates how to instantiate an input factory, create a reader and iterate over the elements of an XML document.
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(...); while (xmlStreamReader.hasNext()) {; }

Competing and complementary ways to process XML in Java (the order is loosely based on initial date of introduction):