双斜杠 (//) 作为 XML 注释

Double slash (//) as XML comment

我有点惊讶,使用双斜杠作为注释似乎是有效的 XML。

以下使用 Python 和 xml.etree.ElementTree 以及 xmllint --format 正确解析:

<root>
    <child1>text1</child1>
    <child2></child2> //this is a valid comment
    <child3></child3>
</root>

我最初认为这可以被视为根元素的文本节点,但在 python3 上尝试证明我错了:

>>> import xml.etree.ElementTree as ET
>>> r=ET.parse("test.xml").getroot()
>>> r.text
'\n    '
>>> child2=r[1]
>>> child2.text
>>> ET.tostring(child2)
b'<child2 /> //this is a valid comment\n    ' 

谁能告诉我允许这样做的规范?

<!--This is a valid comment-->

你需要这样写评论。在 HTML 中形成评论的方式相同。

这不是有效的评论,而是 <root> 元素的文本节点。

<child2></child2> //this is a valid comment

将被视为

...element-node("child2"), text-node(" //this is a valid comment\n"), element-node("child3")...

你想要的是

<child2></child2> <!-- this is a valid comment -->

这将转化为 真实 XML-评论节点

...element-node("child2"), comment-node(" //this is a valid comment"), element-node("child3")...

(为简单起见,我省略了空文本节点。)

XML 说明

不,comments can only be <!-- comment --> in XML. You're seeing //this is a valid comment as text, which is allowed between elements in mixed content。您可以很容易地忽略 //.

Python 元素树解释

ET.tostring(e) 是 returning e.tail(出现在 e 之后的文本)作为其 e 字符串表示的一部分。这可能会造成混淆,因为大多数人会期望 ET.tostring(e) 到 return 严格地是 e 元素的一些字符串值,而不包括其文本节点兄弟。但是,由于 e.tail 是 ET 元素数据结构的一部分,我想 ET 的设计者也认为包含 e.tail 是合理的。