【问题标题】:Encoding space character in XML name在 XML 名称中编码空格字符
【发布时间】:2017-10-08 17:51:01
【问题描述】:

我收到一个 XML 文件,其中包含如下名称:

<Benchↂ0020Codeↂ0020>something</Benchↂ0020Codeↂ0020>

ↂ符号用三个字节表示:0xE2、0x86、0x82。

看起来 ↂ0020 应该被视为空格字符。但是当我使用 System.Xml.XmlReader 读取 XML 时,字符 ↂ0020 不会转换为空格。

有没有办法让它们转换(当然除了替换)?还是我刚刚弄坏了 XML?

【问题讨论】:

  • 根据XML specification,字符 U+2182 是允许的,因此 XML 代码看起来是有效的。但它是一个奇怪的 XML 元素名称。检查您的 XML 代码的来源,如果它是以这种方式生成的,或者您后来以某种方式对其进行了更改。
  • 如果它们是空格,那么这将是一个无效的标签名称。 XML 不一定被破坏,因为Benchↂ0020Codeↂ0020 是一个有效的标签名称,为什么你认为它们应该是空格?
  • 看起来 XML 没有损坏,但它使用私有约定来表示名称,以转义不允许的字符。 XML 解析器不会理解这个约定,由接收应用程序来解释它。
  • @MichaelKay 请发表您的评论作为答案,以便我接受。

标签: c# xml


【解决方案1】:

XML 名称中不允许使用空格字符

86 codepoints whose name contain the word space。忽略由于 MONOSPACE 和任何其他具有视觉表示的 SPACE 命中的代码点,留下以下内容:

  • #x0020空间
  • #x00A0 无间断空间
  • [#x2002-#x200A] EN SPACE 到 HAIR SPACE
  • #x205F中等数学空间
  • #x3000表意空间

W3C XML BNF for component names 不允许在 XML 名称中使用任何与空间相关的代码点(空的视觉表示):

NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] |
                  [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] |
                  [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] |
                  [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
                  [#x10000-#xEFFFF]
NameChar      ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] |
                  [#x203F-#x2040]
Name          ::= NameStartChar (NameChar)*

XML 名称中空格的替代方法

  • CamelCase
  • underscore_char
  • hyphen-char
  • period.char

Colon should not be used 作为 XML 名称中的单词分隔符,以避免与它在 XML 命名空间中的使用混淆。


ↂ 在 XML 名称中是允许的

字符 ↂ (0xE2, 0x86, 0x82, 即#x2182) 与空格无关 - 它是ROMAN NUMERAL TEN THOUSAND。 ↂ 明确允许:#x2182[#x2070-#x218F] 代码范围内。

出现在ↂ之后的0020只是数字。与Benchↂ0020Codeↂ0020 中的其余字符一起,它们构成了一个允许的(尽管非常规)XML 名称。它们不构成 XML 名称中的空格,因为 XML 名称中不允许有空格。

【讨论】:

    【解决方案2】:

    XML 没有损坏,但它使用用于转义不允许字符的私有约定来表示名称。 XML 解析器不会理解这个约定,由接收应用程序来解释它。

    【讨论】:

      猜你喜欢
      • 2016-12-06
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多