【问题标题】:Invalid XML character : xslt error while processing xml无效的 XML 字符:处理 xml 时出现 xslt 错误
【发布时间】:2023-03-18 18:50:01
【问题描述】:

在使用 xslt 处理 xml 时,我收到以下错误,但我在 xml 中看不到这些字符

Character reference "&#16" is an invalid XML character.
Character reference "&#4" is an invalid XML character.
Character reference "&#4" is an invalid XML character.
Character reference "&#18" is an invalid XML character.
Character reference "&#1" is an invalid XML character.
Character reference "&#2" is an invalid XML character.
Character reference "&#25" is an invalid XML character.

请指教。

xml 由具有 utf 8 字符编码的 csv 文本文件形成。

【问题讨论】:

    标签: xml xslt xslt-2.0


    【解决方案1】:

    &# 后面的数字是十进制格式的 ASCII 代码(&#x 将指定十六进制格式的代码)。这些代码 16、4、18 等没有指定任何可打印字符,但它们是默认情况下通常在文本编辑器中不可见的控制字符。 XML 中不允许使用这些字符或实际字节(少数例外),因此您的 XML 无效。

    CSV 文件可能包含这些非法字节,并且 XML 是在没有任何内容验证的情况下形成的(即 CSV 文件的内容只是逐字节复制到 XML 中)。

    这里有一些选项:

    • 检查您的 XSLT 处理器是否可以配置为忽略这些非法字节。
    • 使用一些低级数据处理器自行清理这些字符,该处理器仅读取字节并从中删除所有非法字节。
    • 如果 csv 到 xml 的转换在您的控制之下,请修复它以生成有效的 XML。
    • 如果是第三方应用程序,您应该向供应商请求修复。
    • 使用其他工具从 CSV 文件创建 XML。

    【讨论】:

    • 非常感谢您的意见。您对删除这些控制字符的方法有什么建议吗?
    • @Hari 我已经在我的回答中列出了一些选项供您考虑。
    • 我已经使用 java 代码删除了控制字符。非常感谢大家的支持
    【解决方案2】:

    这些字符引用在 XML 1.1 中是合法的,但在 XML 1.0 中是不合法的。检查您使用的 XML 解析器是否支持 XML 1.1,以及文件顶部的 XML 声明是否指定了<?xml version="1.1"?>

    【讨论】:

      【解决方案3】:

      这些是控制字符。不允许使用控制字符和超出 Unicode 范围的字符。这也意味着禁止调用例如字符实体

      XML recommendation 1.0, §2.2 Characters

      允许的字符的全局列表是:

      [2] 字符 ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* 任何 Unicode 字符,不包括代理块、FFFE 和 FFFF。 */

      【讨论】:

        【解决方案4】:

        这些是non-printable ASCII control codes,范围从 ASCII 表中的十进制 0 或 1 到 31。它们在文本编辑器中是不可见的,因此您看不到它们。如果您可以将编辑器切换到十六进制模式,您会在普通 UTF-8(或其他)编码(如 41h for 'A ',42h 用于'B'。

        因此,摆脱它们的最简单方法是使用过滤掉它们的工具。使用 linux 你可以使用the approach described here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-21
          • 1970-01-01
          • 2011-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-22
          相关资源
          最近更新 更多