【问题标题】:Why is it invalid to have "(" or ")" characters in an XML Element Name?为什么在 XML 元素名称中包含“(”或“)”字符无效?
【发布时间】:2015-06-05 04:58:50
【问题描述】:

我目前在运行时生成 XML 然后尝试在其他地方解析它的应用程序遇到一些问题。

在某些情况下,我收到一条消息“解析属性名称错误”,这是一个失败的 XML 示例:

<datastore>
   <row id="Timer?ID=0">
      <ID>0</ID>
      <START_TIME_(sec)>120</START_TIME_(sec)>
   </row>
</datastore>

解析器在尝试读取 ( 字符时似乎立即失败,这发生在 ) 等其他字符?

我认为 XML 中唯一的无效字符是在这个答案中指定的:https://stackoverflow.com/a/1091953

知道为什么这会失败吗?

【问题讨论】:

  • 我永远不确定人们想要什么样的答案来回答这样的“为什么”问题。 (a) 它是无效的,因为规范是这样说的。 (b) 为什么规范会这样说? (b(i)) 是否有书面证据证明规范作者在做出此决定时使用的理由? (b(ii)) 你能想到一个理性的规范作者做出这个决定的任何理由吗?
  • 我不知道标识符名称中允许使用括号的任何语言。你的期望有合理的依据吗?
  • @MichaelKay 总的来说,我明白你的意思,但在这种情况下,OP 找到了他们认为意味着这些 是有效字符的参考。因此,问题是“另一个参考是错误的,还是我误解了它?”并且(接受的)答案是“这是您误解的内容”。

标签: xml xml-parsing


【解决方案1】:

您找到的答案列出了 XML 文档文本中保留的字符,即元素的内容和属性的值。但是,您的示例在元素名称中使用了标点符号,这受到更严格的限制。

允许的字符的完整列表可以是found in the XML specification;请注意,名称的第一个字符更受限制。 (XML 1.1 expands the list of allowed characters slightly 反映了 Unicode 标准的演变。)需要注意的主要是 ASCII 中的大多数常见标点符号(其 Unicode 代码点低于 #x7f)都被排除在外。

通常的做法是只使用以字母开头并以字母、数字、下划线和连字符开头的名称,但是如果您希望使用它们,编写良好的 XML 解析器应该可以处理更广泛的 Unicode 字符。

以“xml”开头的名称(大小写任意组合)是专门保留的,包含冒号的名称将被解释为使用命名空间,因此也应避免使用。

请注意,这些受限字符没有转义机制,您只需将格式设计为不需要它们。

【讨论】:

    【解决方案2】:

    这些是要在元素文本中编码的字符,但 xml 元素名称有一个命名约定。

    XML 元素必须遵循以下命名规则:

    • 元素名称区分大小写
    • 元素名称必须以 字母或下划线
    • 元素名称不能以字母 xml 开头 (或 XML,或 Xml 等)
    • 元素名称可以包含字母、数字、 连字符、下划线和句点
    • 元素名称不能包含空格

      可以使用任何名称,不保留任何字词(xml除外)。

    (来源:http://www.w3schools.com/xml/xml_elements.asp

    这意味着您的括号在元素名称中无效

    【讨论】:

    • 与 w3schools 上的很多内容一样,该信息是不正确的。开头和后续位置允许的字符的完整列表在这里:w3.org/TR/2008/REC-xml-20081126/#NT-NameChar
    • 或者更广泛的 XML 1.1 列表:w3.org/TR/2006/REC-xml11-20060816/#NT-NameStartChar
    • 我有时想知道为什么 w3schools 到现在还没有纠正错误或关闭。两者都会有所改进。
    • @keshlam 公平地说,他们在过去几年中改进了一些东西,以至于w3fools.com 已经显着降低了措辞。但是,我仍然不相信它们是任何参考的主要来源。在这种情况下,它们通常被过度简化以避免吓跑初学者。
    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 2017-09-16
    • 2014-03-01
    • 2010-11-07
    • 2014-12-04
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多