【问题标题】:Java XML Parsing - incorrect string version of the data with VTD-XMLJava XML Parsing - VTD-XML 数据的错误字符串版本
【发布时间】:2017-07-05 15:38:29
【问题描述】:

我正在使用 VTD-XML 使用 Java 解析 UTF-8 编码的 XML 文档。

一小段摘录如下:

<literal>????</literal>
<literal>????</literal>
<literal>????</literal>

我想遍历每个文字并将其打印到控制台。但是,我得到的是:

¢

我正确地导航到每个元素。我获取文本值的方式是调用:

private static String toNormalizedString(String name, int val, final VTDNav vn) throws NavException {
    String strValue = null;
    if (val != -1) {
        strValue = vn.toNormalizedString(val);
    }
    return strValue;
}

我也尝试过vn.getXPathStringVal();,但结果相同。

我知道上面的每个文字都不仅仅是长度为 1 的字符串。相反,它们似乎是由两个字符组成的 unicode“字符”。如果长度仅为一个,我能够正确解析和输出汉字字符。

我的问题是 - 如何使用 VTD-XML 正确解析和输出这些字符?有没有办法在文字标签之间获取文本的底层字节,以便我自己解析字节?

编辑

处理 XML 每一行的代码 - 将其转换为字节数组,然后再转换回字符串。

try (BufferedReader br = new BufferedReader(new FileReader("res/sample.xml"))) {
        String line;
        while ((line = br.readLine()) != null) {
            byte[] myBytes = null;

            try {
                myBytes = line.getBytes("UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                System.exit(-1);
            }

            System.out.println(new String(myBytes));
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

【问题讨论】:

  • 在调用vtdGen.setDoc(doc)(或vtdGen.setDoc_BR(doc))之前,您是否检查过XML 已正确转换为UTF-8 字符串的byte[] 表示?您还可以通过vtdNav.getEncoding() 检查当前设置的 VTDNav 编码,并根据 VTDNav 中定义的常量检查返回的 int 值
  • @RomanVottner - 是的,我确实检查了 vtdNav.getEncoding() == VTDNav.Format_UTF8 是否为真。您能否详细说明如何检查 XML 是否正确转换为 UTF-8 字符串的 byte[] 表示?谢谢!
  • 获取 2.13_4。它支持补充字符。
  • @Roman Vottner--get 2.13_4 它修复了补充字符问题。
  • @vtd-xml-author 感谢您的努力,如果您可以通过 Maven Central 提供此修复程序,这将是非常棒的,因为 2.13 版可以追溯到 2016 年 6 月

标签: java xml parsing vtd-xml kanji


【解决方案1】:

您可能正在尝试获取包含大于 0x10000 的字符的字符串。该错误是已知的,并且正在解决中……一旦修复完成,我会通知您。 这个问题可能与这个问题相同...... Map supplementary Unicode characters to BMP (if possible)

【讨论】:

  • 感谢您的回复!是的,看起来问题是一样的。我使用了您发布的链接中的代码并使用了字符串???,并获得了与该线程的作者相同的结果(仅使用了低 16 位)。我使用的 vtd-xml 版本是 2.13_2(我相信是最新的)。修复将非常有帮助!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
相关资源
最近更新 更多