【发布时间】:2021-12-20 05:51:23
【问题描述】:
我有点想知道为什么< 必须在 XML 属性中转义,例如
<foo bar="3 < 4" />
从周围(标签内部,属性值内部)来看,解析器应该很清楚它不能是新标签的开始。
XML 规范禁止这样做的原因是什么?
【问题讨论】:
标签: xml parsing xml-parsing special-characters w3c
我有点想知道为什么< 必须在 XML 属性中转义,例如
<foo bar="3 < 4" />
从周围(标签内部,属性值内部)来看,解析器应该很清楚它不能是新标签的开始。
XML 规范禁止这样做的原因是什么?
【问题讨论】:
标签: xml parsing xml-parsing special-characters w3c
小于字符 (&lt;) must 确实是属性值内的escaped:
格式良好的约束:属性值中没有
&lt;直接或间接引用的任何实体的替换文本 在属性值(“
&lt;”除外)中不得包含&lt;。
如您所见,可以明确解析包含&lt; 的属性值。然而,动机是使 XML 的解析规则尽可能简单......
据 XML 1.0 W3C 推荐标准的编辑之一、The Annotated XML Specification 的作者 Tim Bray 所说,它抓住了 XML 设计决策背后的一些基本原理:
消除
&lt;从表面上看,这条规则可能看起来有点不必要 其中。由于属性值中不能有标签,所以有一个
这是让DPH 的生活更轻松的又一次尝试。 XML 中的规则 很简单:当你在阅读文本时,你点击了
&lt;,那就是 标记分隔符。不只是有时,总是。当你想要一个在 数据,你必须使用&lt;。不只是有时,总是。在属性中 价值观。这条规则还有另一个意想不到的有益副作用;它使 捕获某些错误要容易得多。假设你有一大块 XML如下:
<a href="notes.html> <img src='notes.gif'></a>请注意,notes.html 缺少结束引号。没有 no-
&lt;规则,很难检测到这个问题并且 发出合理的错误信息。由于属性值可以包含 几乎任何东西,在处理器发现之前不会检测到错误 下一个引号。相反,您首先会收到一条错误消息 您点击&lt;的时间,在上面的示例中,在许多情况下,它是 几乎立即。
【讨论】:
&lt; 在 cmets 和处理指令的内容中被允许的事实......
> 是 允许的,这也使 DPH 的生活复杂化。但是一个不太好的理由仍然是一个理由,这句话似乎为“什么是原因”这个问题提供了一个客观的答案,而不是更主观的问题“应该排除&lt; 吗?”,我不知道'认为在 SO 的职权范围内无法回答。
我不确切知道,但在许多情况下,解释是与 SGML 兼容。 XML 被设计为 SGML 的子集,因此不允许 SGML 不允许的事情。
【讨论】: