【问题标题】:How to parse XML with tag names that contain non-latin Unicode characters with the DocumentBuilder DOM parser on Android如何使用 Android 上的 DocumentBuilder DOM 解析器解析包含非拉丁 Unicode 字符的标签名称的 XML
【发布时间】:2015-10-30 20:10:10
【问题描述】:

好的,我有一个由其他人编写的 Android 应用,但我的工作是维护和进一步开发。该应用程序使用一个以 XML 格式回答的 API。代码很标准:

InputStream in = httpConnection.getInputStream();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = db.parse(in);

除非标签名称中有非拉丁字符,否则一切正常。 例如这样就可以了:

<Milen>some_text</Milen>

但这引发了一个异常:

<Милен>some_text</Милен>

例外是INVALID_CHARACTER_ERR。经过一番调查,我发现DOM API 的实现是org.apache.harmony.xml.dom.DocumentImpl。并且在第 286 行引发了异常here。if 检查归结为这种方法:

private static boolean isXMLIdentifierPart(char c) {
    return isXMLIdentifierStart(c) || (c >= '0' && c <= '9') || (c == '-') || (c == '.');
}

这基本上排除了任何非拉丁字符。但是,根据this,任何 Unicode 字符都是有效的标签名称。

所以我的问题是:

  1. 为什么会有这样一项违反标准的检查?
  2. 我有哪些选项可以让 DOM 解析器处理非拉丁 Unicode 字符?

一些补充说明:

  • 服务器返回正确的 UTF-8 响应
  • 我尝试过使用XML escaping,但很明显,在签入isXMLIdentifierPart 之前这已转换回原始Unicode
  • 我强烈倾向于坚持使用 DOM 解析器 API,因为之后的处理假定将 Document 对象传递给它。重写处理过程需要大量工作。

我想到的两个解决方案是:

  1. 获取 org.apache.harmony.xml.dom.DocumentImpl 实现的代码并创建缺少问题检查的自定义解析器。
  2. 让服务器使用一些仅使用拉丁字符的自定义架构对非拉丁字符进行编码(\u1234 或 U+1234 不起作用),然后在解析器完成工作后将其解码。

但是,这两种解决方案都是非标准的,并且都不喜欢它们。因此,任何适当的方法都非常受欢迎!!!

免责声明:我是 Android 平台的新手,我可能会遗漏一些简单/明显的东西。但是,经过两天的研究和实验,我没有找到它。

【问题讨论】:

    标签: android xml dom unicode


    【解决方案1】:

    据此,任何 Unicode 字符都是有效的标签名称。

    不完全是任何字符,但是是的,在第五版中绝大多数非ASCII字符是允许的(之前规则相当复杂,但仍然允许很多)。

    为什么会有这样一个违反标准的检查?

    因为 Harmony DOM 实现是一个有缺陷的、不符合标准的、维护不善的堆,无法正确实现旧规范,所以只是一揽子不允许使用非 ASCII。还有许多其他问题。

    这是issue 78387 FWIW。

    我有哪些选择可以让 DOM 解析器处理非拉丁 Unicode 字符?

    看看你是否能找到一个替代的、更少损坏的 DOM 实现。

    获取 org.apache.harmony.xml.dom.DocumentImpl 实现的代码并创建一个缺少问题检查的自定义解析器。

    (是的,这可能必须是一个适当的分叉,因为单独使用子类很难做到。太多的类之间有明确的引用。)

    【讨论】:

    • 谢谢!指向 Google Code 问题的链接非常有帮助,因为它把我带到了 Xerces-For-Android,它被证明是一个非常好的解析库。我知道链接中的解决方案在这里不太受欢迎,因为链接及其相关资源将来可能会消失。因此,请编辑您的帖子以包含图书馆的链接。
    猜你喜欢
    • 2013-06-03
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2013-01-31
    相关资源
    最近更新 更多