【问题标题】:Comments in ET: more than comment tagET 中的评论:不仅仅是评论标签
【发布时间】:2019-11-07 15:38:04
【问题描述】:

我有一个 xml 文件,例如:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Chapter PUBLIC 'blub' 'blub.dtd'>
<Chapter>
    <Tag>
        <TagEntry y.validity.allowed="true" y.validity.mode="positive">
            <!--Kommentar 1-->
            <!--Kommentar 2-->
            <!--Kommentar 3-->Inhalt 1<!--Kommentar 4--></TagEntry>
        <TagEntry>
            Inhalt 2 erg&#228;nzt <!--Kommentar 5-->mit Umlaut
        </TagEntry>
        <TagBase>
            <!--Kommentar 6-->
            <!--Kommentar 7-->Inhalt 3</TagBase>
        <TagNothing>
            Inhalt 3<!--Kommentar 8-->
        </TagNothing>
    </Tag>
</Chapter>

现在我想遍历 cmets。 我用 lxml.etree 作为 ET-tree 做到了:

comments = root.xpath('//comment()')
for comment in comments:
    print(ET.tostring(comment))

但不是打印所有没有父节点文本的 cmets,而是打印:

b'<!--Kommentar 1-->'
b'<!--Kommentar 2-->'
b'<!--Kommentar 3-->Inhalt 1'
b'<!--Kommentar 4-->'
b'<!--Kommentar 5-->mit Umlaut\n\t\t'
b'<!--Kommentar 6-->'
b'<!--Kommentar 7-->Inhalt 3'
b'<!--Kommentar 8-->\n\t\t'

有人可以向我解释一下,为什么会发生这种情况,以及我可以如何更改 xpath 表达式以仅返回注释节点而不将文本附加到注释末尾​​。

谢谢!

【问题讨论】:

    标签: python xml xpath lxml elementtree


    【解决方案1】:

    注释节点包含tail 文本(默认;参见https://lxml.de/api/lxml.etree-module.html#tostring)。

    为了摆脱尾巴,改变

    print(ET.tostring(comment))
    

    到

    print(ET.tostring(comment, with_tail=False))
    

    如果您只对 cme​​ts 的内容而不是标记感兴趣,请使用:

    print(comment.text)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      相关资源
      最近更新 更多