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

时间:2017-07-07 17:55:53

标签: xml python-3.x xml-parsing w3c

我有点惊讶的是,使用双斜杠作为注释似乎是有效的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    ' 

有人能指出允许这样做的规范吗?

3 个答案:

答案 0 :(得分:5)

XML说明

不,comments 只能在XML中为<!-- comment -->。您看到//this is a valid comment 文字 mixed content中的元素之间允许这样做。你可以很容易地遗漏//

Python ElementTree说明

ET.tostring(e)正在返回e.taile之后出现的文字)作为其e字符串表示的一部分。这可能会令人困惑,因为大多数人都希望ET.tostring(e)严格返回e元素的某些字符串值,而不包括其文本节点兄弟。但是,由于e.tail是ET元素数据结构的一部分,我认为ET的设计者也认为包括e.tail也是合理的。

答案 1 :(得分:2)

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

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

将被视为

  

... element-node(&#34; child2&#34;),text-node(&#34; //这是一个有效的注释\ n&#34;),element-node(&#34; child3&#34)...

你想要的是

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

将转换为真正的 XML-comment-node

  

... element-node(&#34; child2&#34;),comment-node(&#34; //这是一个有效的评论&#34;),element-node(&#34; child3&# 34)...

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

答案 2 :(得分:0)

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

您需要以这种方式发表评论。同样的方式注释在HTML中形成。