【问题标题】:Well formed XML? XML references within tag names and attribute names格式良好的 XML?标记名称和属性名称中的 XML 引用
【发布时间】:2009-04-08 17:53:22
【问题描述】:

我一直在搜索以确认我对 XML 规范的阅读。我的解释是标签名称和属性名称中不允许使用预定义的实体和数字字符引用,例如 XML 1.0 规范不允许这样做。:

<root>
<test&apos;&#x27;&#39;tag test&apos;&#x27;&#39;attribute="one"/>
</root>

但是,我有一个解析器返回 test'''tag 作为标签名称和 test'''attribute 作为属性名称,而另一个解析器返回 test&amp;apos;&amp;#x27;&amp;#39;tag 用于标记名称,test&amp;apos;&amp;#x27;&amp;#39;attribute 用于属性名称。

哪个解析器是正确的?还是它们都错了(即它们应该抛出一个格式正确的错误)?

谢谢!

【问题讨论】:

  • 那里有一些非常狡猾的解析器!我可以使用的每个 XML 解析器都正确地确定了上述示例的格式错误。

标签: xml


【解决方案1】:

这很简单:名称中不能使用实体。两个“解析器”在这里都是错误的。 XML 规范非常清楚地定义了这一点——没有隐藏的默认规则;如果某些构造不包括在内,则不允许。

实体只能在常规字符内容和属性值中使用。并且它们可以包含在其他一些地方(cmets、处理指令、DTD 子集)但不会被扩展(即不被识别为实体)。

【讨论】:

    【解决方案2】:

    在我看来,他们都错了。根据spec,开始标签中只能包含以下字符:

    ":" | [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] | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
    

    XMLSpy 当然也不满意。也不是

    而且...只是为了更好的衡量...这是 .NET 不得不说的:

    The '&' character, hexadecimal value 0x26, cannot be included in a name. Line 1, position 12.
    

    你用的是什么解析器?

    【讨论】:

    • 谢谢楼主!我同意这似乎是一个格式错误。规范中还有其他地方。其中 PEReferences 和 References 明确显示是允许的。但它们没有明确显示标签名称或属性名称。我正在测试的解析器是内部生成的。
    【解决方案3】:

    w3.org 的挖掘中,我发现了以下相关部分:

    [41] Attribute ::= Name Eq AttValue [VC: Attribute Value Type] [WFC: No External Entity References] [WFC: No

    [WFC:无外部实体引用]链接到:

    格式良好的约束:没有外部实体引用
    属性值不得包含对外部实体的直接或间接实体引用。

    名称链接到:

    [5] 名称 ::= NameStartChar (NameChar)*

    [4] 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]

    [4a] NameChar ::= NameStartChar | "-" | “。” | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]

    是的,它像泥巴一样清澈!我对此的解释是,您可以使用十六进制实体引用,只要它们落在上面指定的范围内,但您不能使用预定义的引用。

    当名称不符合此要求时,我预计会出现格式正确的错误。

    【讨论】:

    • 谢谢,26 个中的 17 个!我实际上根本不倾向于任何实体引用,因为 & 似乎完全被禁止(请参阅 dommer 的回答)。
    • 我当然从未见过以这种方式使用它们,我个人会避免使用它。
    猜你喜欢
    • 2012-06-06
    • 2012-01-21
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多