XMLStreamReader和XMLEventReader有什么区别?

时间:2016-04-19 11:44:29

标签: java xml xml-parsing stax xmlstreamreader

我浏览网页。我发现 XMLStreamReader 用于解析XML的Cursor样式API XMLEventReader 用于解析XML的迭代器样式API 。任何人都可以详细告诉我吗?

3 个答案:

答案 0 :(得分:7)

看看解释:https://www.ibm.com/developerworks/library/x-stax1/

  

XMLStreamReader和XMLEventReader都允许应用程序自己迭代底层XML流。这两种方法的区别在于它们如何公开解析的XML InfoSet的各个部分。 XMLStreamReader充当游标,指向最近解析的XML令牌,并提供获取有关它的更多信息的方法。这种方法非常节省内存,因为它不会创建任何新对象。但是,业务应用程序开发人员可能会发现XMLEventReader更直观,因为它实际上是一个标准的Java Iterator,它将XML转换为事件对象流。每个事件对象依次封装与其表示的特定XML结构有关的信息。本系列的第2部分将提供基于事件迭代器的API的详细说明。   至于使用哪种API样式取决于具体情况。基于事件迭代器的API表示比基于游标的API更面向对象的方法。因此,在模块化体系结构中应用更容易,因为当前的解析器状态反映在事件对象中;因此,应用程序组件在处理事件时不需要访问解析器/读取器。此外,可以使用XMLInputFactory的createXMLEventReader(XMLStreamReader)方法从XMLStreamReader创建XMLEventReader。

答案 1 :(得分:1)

我认为区别在于流阅读器实际上代表事件。

XMLEvent event = eventReader.nextEvent();    
if(event.getEventType() == XMLStreamConstants.START_ELEMENT){
    StartElement startElement = event.asStartElement();
    System.out.println(startElement.getName().getLocalPart());
}

vs

streamReader.next();
if(streamReader.getEventType() == XMLStreamReader.START_ELEMENT){
    System.out.println(streamReader.getLocalName());
}

因此,每次为事件读取器创建一个额外的事件对象。发生的事件很多,因此开销可能很大。

答案 2 :(得分:0)

两者之间的区别是XMLEventReader支持peek(),而XMLStreamReader不支持。