我在网上冲浪。我发现XMLStreamReader是用于解析 XML 的光标样式 API。XMLEventReader是用于解析 XML 的迭代器样式 API。谁能详细告诉我?
3 回答
看看解释:https ://www.ibm.com/developerworks/library/x-stax1/
XMLStreamReader 和 XMLEventReader 都允许应用程序自行迭代底层 XML 流。这两种方法之间的区别在于它们如何公开已解析的 XML InfoSet 片段。XMLStreamReader 充当一个光标,它指向最近解析的 XML 标记之外,并提供获取有关它的更多信息的方法。这种方法非常节省内存,因为它不会创建任何新对象。但是,业务应用程序开发人员可能会发现 XMLEventReader 更直观一些,因为它实际上是将 XML 转换为事件对象流的标准 Java 迭代器。每个事件对象依次封装与其所代表的特定 XML 结构有关的信息。本系列的第 2 部分将详细描述基于事件迭代器的 API。至于使用哪种 API 样式,则视情况而定。基于事件迭代器的 API 代表了一种比基于光标的 API 更面向对象的方法。因此,在模块化架构中更容易应用,因为当前解析器状态反映在事件对象中;因此,应用程序组件在处理事件时不需要访问解析器/读取器。此外,可以使用 XMLInputFactory 的 createXMLEventReader(XMLStreamReader) 方法从 XMLStreamReader 创建 XMLEventReader。应用程序组件在处理事件时不需要访问解析器/读取器。此外,可以使用 XMLInputFactory 的 createXMLEventReader(XMLStreamReader) 方法从 XMLStreamReader 创建 XMLEventReader。应用程序组件在处理事件时不需要访问解析器/读取器。此外,可以使用 XMLInputFactory 的 createXMLEventReader(XMLStreamReader) 方法从 XMLStreamReader 创建 XMLEventReader。
我认为不同之处在于流阅读器实际上代表了事件。
XMLEvent event = eventReader.nextEvent();
if(event.getEventType() == XMLStreamConstants.START_ELEMENT){
StartElement startElement = event.asStartElement();
System.out.println(startElement.getName().getLocalPart());
}
对比
streamReader.next();
if(streamReader.getEventType() == XMLStreamReader.START_ELEMENT){
System.out.println(streamReader.getLocalName());
}
因此,每次都会为事件阅读器创建一个额外的事件对象。由于有很多很多事件,开销可能很大。
两者之间的一个区别是XMLEventReader
支持peek()
,而不支持XMLStreamReader
。