【问题标题】:Double slash (//) as XML comment双斜杠 (//) 作为 XML 注释
【发布时间】:2017-12-12 02:49:35
【问题描述】:

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

以下使用 Python 和 xml.etree.ElementTreexmllint --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    ' 

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

【问题讨论】:

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


    【解决方案1】:

    XML 说明

    不,comments 在 XML 中只能&lt;!-- comment --&gt;。您将 //this is a valid comment 视为 text,这在 mixed content 中的元素之间是允许的。你可以很容易地忽略//

    Python ElementTree 解释

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

    【讨论】:

      【解决方案2】:

      这不是有效的注释,而是&lt;root&gt; 元素的文本节点。

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

      会被视为

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

      你想要的是

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

      这将转换为 real XML-comment-node

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

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

      【讨论】:

      • 不,它不被视为根目录下的文本节点。在 python 上试试:它是 child2 节点的一部分
      • 试试xmllint --sax a.xml。结果显示字符出现在child2元素之后。
      • 有趣!因此,如果是不属于 child2 的字符,为什么 ET.tostring(child2) 会打印它们?这会是 xml.etree 中的问题吗?
      • @navidof:这是因为ET.tostring(child2) 正在返回child2.tail 作为其child2 的字符串表示形式的一部分。诚然,这令人困惑,但这并不意味着 e.tailchild2 的子代。有关详细信息,请参阅my answer
      【解决方案3】:
      <!--This is a valid comment-->
      

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

      【讨论】:

      • 嗯,我知道那个,我想知道为什么另一种形式也有效。在 xml 规范中找不到与此相关的任何内容。但我可能看错地方了。
      • 没有其他形式可以工作。有 CDATA,但不一样。stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean。 Python解析它的事实并不意味着它作为注释是正确的,它被视为根节点下的文本,正如zx485所指出的那样。
      • 我的测试结果恰恰相反。我认为python尊重标准,它不会解析无效的xml。所以这出于某种原因是有效的xml
      • 这不是无效的 XML,只是不是注释。 //这是一个有效的评论,不是评论而是文本。
      猜你喜欢
      • 2012-06-15
      • 2014-07-18
      • 1970-01-01
      • 2023-02-17
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      相关资源
      最近更新 更多