【问题标题】:xml parse error on illegal character非法字符的xml解析错误
【发布时间】:2010-06-28 23:50:35
【问题描述】:

所以,我作为最后的手段问,因为我完全没有想法。

我有一个 Windows ASP.NET ASMX Web 服务应用程序,它返回一个带有 -- 姓名、地址、电子邮件...等

但是xml中的一些属性编码很奇怪,例如-&#x1a(我不知道编码发生在哪里。我假设在序列化过程中)

googling those characters我看是“Windows-1252”编码。

在解析XML时出现问题,我发现在1252编码的位置出现“invalid unicode character”的解析错误。

我怎样才能成功解析它?你建议什么解决方案?

【问题讨论】:

    标签: xml encoding


    【解决方案1】:

    解析器是正确的,无论产生什么序列化都是错误的。与大多数 C0/C1 控制字符一样,将 U+001A SUBSTITUTE 放入 XML 1.0 文件 (*) 是无效的——实际上,更糟糕的是:格式不正确——即使编码为字符引用,例如.

    没有任何 XML 解析器会读取它,也不应该读取它。虽然您可以在将 序列传递给解析器之前尝试过滤掉它们,但这种粗略的hack 不适用于一般情况。应该修复序列化器以停止生成它们。

    实际上,我不知道该字符(通常用于在古老的可怕操作系统中标记文件结尾)如何进入 ASP.NET 应用程序使用的数据集,但它似乎不会播放任何有效的姓名、地址或电子邮件中的角色。也许您真的需要考虑清理您的数据。

    (*: 如果在 XML 1.1 文档中编码为字符引用是合法的。如果您绝对必须通过 XML 来回控制字符,则必须使用 XML 1.1。尽管这可能会导致与旧的 XML 解析器,你仍然不能使用 U+0000 NULL 字符,所以你永远不会是完全二进制安全的。)

    【讨论】:

    • 感谢您的详细回答——我假设数据是作为 word 文件或类似文件的复制粘贴输入的。
    • 是的,这对于 0x80-0x9F 范围内的 C1 控制代码很常见(通常来自错误解释为 ISO-8859-1 的代码页 1252 智能引号),但 0x1A 控制代码不被 Word 或我能想到的任何其他常见的现代 Windows 应用程序用于任何用途。
    • 所以,鲍勃,我无法控制数据如何传给我——这是拥有可怕的黑客并将其从字符串中删除的唯一方法,或者是否有其他方式来表示它—— - 例如在序列化之前 - 检查字符串是否是 UTF-8 合法的。
    • 这不是编码问题:字符 U+001A 在 UTF-8、ISO-8859-1 或普通的旧 7 位 ASCII 中同样无效。您可以通过简单的字符串替换来删除字符串,但所有使用字符串/正则表达式黑客攻击处理XML 的尝试都有可能破坏它不是标记的情况,例如<!-- comment --><?pi?><![CDATA section]]>。但是您不能将此输入作为 XML 处理,因为其中包含此控制字符,它根本就不是 XML。如果它应该是 XML,您需要找到负责生成它的一方并大声抱怨,直到他们修复它。
    • 我们看到了这个 字符转义/编码进入我们基于 Web 的订单输入系统 (asp.net mvc 4 / WCF),它来自我们的一位专家从 Outlook 复制/粘贴。在 Outlook 中,它看起来像是一个聪明的报价,有人试图指出 英寸。它成功地保存到我们的数据库中,但是,当我们尝试使用 CAST(theDataField as XML)从 SQL 中选择它时,我们确实得到了一个错误 - (fwiw 我们的 DB 字段不是 XML 类型,即使这是我们存储在其中的内容,因此通常成功的演员阵容失败)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多