1.StAX(The Streaming API for XML),是一种利用拉模式解析(pull-parsing)XML文档的API。
StAX 把重点放在流上,它提供了两套处理 XML 的 API:基于指针的 API, 把 XML 文档当做一个标记(或事件)流来处理;允许应用程序检查解析器的状态,获得解析的上一个标记的信息,然后再处理下一个标记,依此类推;另一种较为高级的是基于迭代器的 API,把 XML 作为一系列事件对象来处理,每个对象和应用程序交换 XML 结构的一部分。应用程序根据需要定制解析事件的类型,然后将其转换成对应的具体类型,然后利用定制事件提供的方法获得属于该事件的信息。
2.StAX工作原理:通过一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符。
3.StAX和SAX的区别:
SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件。SAX中解析器是工作主体,而事件处理器是由解析器驱动的,如果解析文档过程中产生问题,则剩余的所有文档就无法处理。
StAX使用拉模式,解析器首先将XML文档所有的事件全部取出,然后通过处理程序处理这些事件。StAX中处理器是工作主体,如果解析文档过程中产生问题,只会影响到出问题的部分,其余部分处理不受影响。
1. 通过一个简单的StAX例子,讲解StAX的基本工作过程:
(1).创建XMLInputFactory :
XMLInputFactory factory = XMLInputFactory.newInstance();
(2).读入XML文档:
Reader fileReader = new FileReader(xmlfile); factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
(3).通过XMLInputFactory 创建StAXReader:
XMLStreamReader reader = factory.createXMLStreamReader(fileReader);
(4).获取XML文档节点事件:
//获取节点类型,结果是以整形的方式返回的。 int event = reader.getEventType();
(5).根据XML文件节点事件处理进行调用相应的事件处理程序。
5.StAX定制事件:
StAX一种比较高级的基于迭代器的XML处理API需要定制事件,定制事件的要点:
(1).定制的事件都必须实现 XMLEvent 接口,很遗憾,目前为止还没有任何基类可以继承,所以基本上应用程序需要实现每一个 XMLEvent 接口定义的方法。
(2).定制的事件都必须有一个 int 型的值作为事件的 type。系统默认的事件类型有:
a.表示文档的开始:XMLStreamConstants.START_DOCUMENT。
b.表示元素的开始:XMLStreamConstants.START_ELEMENT。
c.表示元素字符:XMLStreamConstants.CHARACTERS。
d.表示元素的结束:XMLStreamConstants.END_ELEMENT。
e. 表示文档的结束:XMLStreamConstants.END_DOCUMENT。
6.StAX定制EventReader:
如果定制了自己StAX的事件,那么系统默认的 EventReader 已不能满足要求。所以程序需要定义自己的 EventReader。
XMLEventReader 实际上是实现了 iterator,EventReaderDelegate 是一个便利类,代理了所有的 EventReader 的功能,经过定制的EventReader 后,原始的 XMLEvent 事件流就转变成了包含一系列定制事件的事件流。当然除了定制事件之外的那些原始的 XML Events事件都还在。
7.StAX定制EventWriter:
StAX EventWriter的工作就是把过滤出来的 Event 流的序列化。StAX API 提供了 XMLEventWriter,提供默认支持的 event 的序列化。如果定制了StAX事件,默认的 XMLEventWriter 就不能满足需求,所以需要定制XMLEventWriter。
定制的 event writer 主要需要实现 XMLEventWriter接口的add( XMLEvent) 方法,把程序定制的 Entry Event 加到 XMLEventWriter 里面。其余的方法都是用 XMLEventWriter 的默认功能。
8.StAX的优点:
(1).有针对简单和性能的两种解析模式。
(2).由程序控制解析器,易于支持多输入。
(3).强大的过滤功能有利于数据检索。
9.StAX的不足和适用场景:
和SAX类似,StAX的不足为:
(1).没有内建的文档导航支持。
(2).不能随机访问 XML 文档。
(3).不支持修改 XML 文档。
StAX适用于:需要对 XML 文档进行流处理而且支持命名空间的程序(不要用来操作和修改XML 文档)。