XMLStreamReader:获取字符偏移量:文件中的XML

时间:2013-04-12 14:37:16

标签: java stax

XMLStreamReader - >位置有一个名为getCharacterOffset()的方法。

不幸的是,Javadocs表明这是一个非常命名的方法:它也可以返回一个字节偏移量(这在实践中似乎是真的);没有用,这似乎是从文件中读取时(例如):

Javadoc州:

  

将字节或字符偏移量返回到输入源   位置指向。如果输入源是文件或字节   然后这是字节偏移到该流,但如果输入   source是字符媒体,然后偏移量是字符偏移量。 (重点补充)

我真的需要字符偏移量;而且我很确定我会被赋予字节偏移量。

(UTF-8编码)XML包含在(部分损坏的1G)文件中。 [因此需要使用一个较低级别的API,它不会抱怨缺乏良好的形式,直到它真的别无选择,直到]。

问题

当Javadoc说“输入源是一个角色媒体......”时,Javadoc是什么意思:我如何强迫它将我的输入文件视为“角色媒体” - 这样我才能得到准确的(字符)偏移而不是字节偏移?

额外等等等等。

[我很确定这是正在发生的事情 - 当我剥离文件时(使用某些已知的高级标签)我得到一些字符丢失或额外 - 以非准确的方式 - 我是将差异缩小到几个多字节字符抛出计数器:同样当我复制时(例如在Powershell中使用'head'/'tail' - 此工具似乎正确识别[或假设UTF-8]并执行据我所知,很好地转换为UTF-16]

2 个答案:

答案 0 :(得分:3)

偏移量以基础Source为单位。

XMLStreamReader只知道它从Source读取的单位数,因此偏移量以这些单位计算。

Streambyte为单位工作,因此最终会产生byte偏移量。

Readerchar为单位工作,因此您最终会在char中找到偏移量。

StreamSource的文档更明确地表达了“角色媒体”的含义。

也许尝试像

这样的东西
final Source source = new StreamSource(new InputStreamReader(new FileInputStream(new File("my.xml")), "UTF-8"));
final XMLStreamReader xmlReader = XMLInputFactory.newFactory().createXMLStreamReader(source);

答案 1 :(得分:1)

XMLInputFactory.createXMLStreamReader(java.io.InputStream)是一个字节流

XMLInputFactory.createXMLStreamReader(java.io.Reader)是一个字符流