StAX处理XML

    技术2022-07-01  67

     

    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.StAXSAX的区别:

    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 实际上是实现了 iteratorEventReaderDelegate 是一个便利类,代理了所有的 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 文档)。

     


    最新回复(0)