StAX 框架(Streaming API for XML)
SAX 框架的缺點是不能記錄正在處理元素的上下文。但是優點是運行時占內存空間比較小,效率高。DOM 框架由于在處理 XML 時需要為其構造一棵樹,所以特點正好相反。StAX 框架出現于 Java SE 6 中,它的設計目標就是要結合 SAX 框架和 DOM 框架的優點。既要求運行時效率,也要求保持元素的上下文狀態。清單 5 是一段使用 StAX 框架處理 XML 文件的代碼。
清單 5. 使用 StAX 框架處理 XML 文件
import java.io.*;
import javax.xml.stream.*;
import javax.xml.stream.events.*;
public class StAXTest {
public static void main(String[] args) {
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
InputStream input = new ByteArrayInputStream(
("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<work-contact-info>" +
"<Location>Shanghai-shuion-333</Location>" +
"<Postal>200020</Postal>" +
"<Tel><fix>63262299</fix><mobile>1581344454</mobile></Tel>" +
"<Appellation>Mr. Wang</Appellation>" +
"</work-contact-info>").getBytes());
try {
XMLEventReader xmlEventReader = inputFactory.createXMLEventReader(input);
while (xmlEventReader.hasNext()) {
XMLEvent event = xmlEventReader.nextEvent();
if (event.isStartElement()) {
StartElement startElement = event.asStartElement();
System.out.println(startElement.getName().toString());
}
if (event.isCharacters()) {
Characters text = event.asCharacters();
if (!text.isWhiteSpace()) {
System.out.println("\t" + text.getData());
}
}
}
} catch (XMLStreamException e) {
e.printStackTrace();
}
}
}
|
觀察后可以發現 StAX 框架和 SAX 框架具有相似的地方。StAX 有 Event.isStartElement
方法,SAX 有 DefaultHandler.startElement
方法。StAX 有 Event.isCharacter
方法,SAX 有 DefaultHandler.character
方法。實際上這兩個框架處理 XML 文件的時候使用了相似的模型——將 XML 文件作為元素組成的流,而不同于 DOM 的樹模型。解析 XML 文件時,應用程序調用 XMLEventReader
的 nextEvent
方法解析下一個元素(或者是解析同一個元素,根據解析的不同階段,產生不同元素),StAX 就會通過 XMLEventReader
產生一個事件。比如針對同一個元素,可能會產生 StartElement
和 EndElement
事件。形象的說 XMLEventReader
就像是一根繩子,拽一下,解析一個元素,產生一個事件。于是這種技術也被稱為”Pull Parser”技術。StAX 在處理 XML 文件時,產生的所有事件是通過一個 Iterator
(XMLEventReader
繼承了 Iterator
)返回的。應用程序通過這個 Iterator
能知道某個解析事件的前后分別是什么。這類信息就是一個元素的上下文信息。