【发布时间】:2011-03-11 17:38:39
【问题描述】:
有没有办法使用 XMLStreamReader 准确地收集 xml 标签的字节偏移量?
我有一个需要随机访问的大型 xml 文件。我不想将整个内容写入数据库,而是希望使用 XMLStreamReader 运行一次以收集重要标签的字节偏移量,然后稍后能够使用 RandomAccessFile 检索标签内容。
XMLStreamReader 似乎没有办法跟踪字符偏移量。相反,人们建议将 XmlStreamReader 附加到跟踪已读取字节数的读取器(例如 apache.commons.io 提供的 CountingInputStream)
例如:
CountingInputStream countingReader = new CountingInputStream(new FileInputStream(xmlFile)) ;
XMLStreamReader xmlStreamReader = xmlStreamFactory.createXMLStreamReader(countingReader, "UTF-8") ;
while (xmlStreamReader.hasNext()) {
int eventCode = xmlStreamReader.next();
switch (eventCode) {
case XMLStreamReader.END_ELEMENT :
System.out.println(xmlStreamReader.getLocalName() + " @" + countingReader.getByteCount()) ;
}
}
xmlStreamReader.close();
不幸的是,必须进行一些缓冲,因为上面的代码为多个标签打印出相同的字节偏移量。是否有更准确的方法来跟踪 xml 文件中的字节偏移量(最好不要放弃正确的 xml 解析)?
【问题讨论】:
-
我发现 StAX2 API 提供了非常有前途的 LocationInfo 类,方法是 getStartingByteOffset() 和 getStartingByteOffset()。不幸的是,这些总是返回-1。有人熟悉 Stax2 和 Woodstox 吗?有什么方法可以配置阅读器以使此位置信息可用?
-
Dave:不幸的是,即使解析器是直接从 InputStream 构造的,当前的实现也无法获得实际的字节偏移量。因此,您最好的选择是使用 Reader 和字符偏移:这些都是可靠且有效的。这可能会产生额外的成本,但比尝试使用外部解决方案更可靠,其中问题是解析器的缓冲,这使得精确偏移相当困难。顺便说一句:Aalto 可以提供偏移量,但它的测试较少且功能较少。但它确实完全实现了基本的 Stax。
-
顺便说一句,请随时在 Woodstox 用户或开发人员列表中提出这个问题;其他人可能有其他建议。我确实知道在很多地方都使用了字符偏移量(例如,用于编辑器等以指示错误位置)