【问题标题】:XMLStreamReader: get character offset : XML from fileXMLStreamReader:获取字符偏移量:来自文件的 XML
【发布时间】:2013-04-12 14:37:16
【问题描述】:

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

不幸的是,Javadocs 指出这是一个模棱两可的方法:它还可以返回一个字节偏移量(这在实践中似乎是正确的);从文件中读取(例如)时似乎会发生这种情况:

Javadoc 声明:

将字节或字符偏移量返回到输入源 this 位置指向。如果输入源是文件或字节 stream 那么这是该流中的字节偏移量,但如果输入 source 是字符媒体,那么偏移量就是字符偏移量。 (强调)

我真的需要 字符 偏移量;而且我很确定我得到的是 byte 偏移量。

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

问题

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

额外的废话:

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

【问题讨论】:

    标签: java stax


    【解决方案1】:

    偏移量以底层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);
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 使用字节流( XMLInputFactory.newInstance().createXMLEventReader(new FileInputStream(...)) )时,getCharacterOffset() 的返回类型是否为 int 是一个问题,但是一个文件(以字节为单位)可以是一个长文件,根据 File.length(),它返回一个 long?
      猜你喜欢
      • 2011-03-11
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 2015-08-08
      • 2012-04-28
      • 1970-01-01
      相关资源
      最近更新 更多