【问题标题】:How do I remove a comment outside of the root element of an XML document using lxml如何使用 lxml 删除 XML 文档根元素之外的注释
【发布时间】:2020-07-19 02:54:58
【问题描述】:

我有一些 Python,我正在尝试从我无法控制的各种 XML 文档中删除所有 cmets。这应该能够处理任何有效的 XML。到目前为止的代码如下:

tree = lxml.etree.parse(path_to_xml_file)
for c in tree.xpath('//comment()'):
  c.getparent().remove(c)

这段代码在这个特定的 XML 文件上崩溃:

<!-- This comment can't be removed. -->
<foo>
  <!-- This comment can be removed. -->
</foo>

无法删除第一条评论,因为它没有父元素。 c.getparent() 在该评论上返回 None。我没有看到有关如何从 XML 树中删除节点的任何其他文档。这个is valid XML。那么如何删除这条评论呢?

【问题讨论】:

    标签: python xml lxml


    【解决方案1】:

    要删除所有 cmets,请使用 XMLParserremove_comments=True

    from lxml import etree
    
    parser = etree.XMLParser(remove_comments=True)
    tree = etree.parse("test.xml", parser)
    

    【讨论】:

      【解决方案2】:

      如果你在用 lxml 解析它之前或之后用一个新标签包装你的 xml 就可以做到(这不是很漂亮,但也可以)。

      假设你要在 lxml 之外进行:

      comt = """
      <!-- This comment can't be removed. -->
      <foo>
        <!-- This comment can be removed. -->
      </foo>
      """
      
      new_comt = "<super_root>"+comt+"</super_root>"
      tree = etree.fromstring(new_comt)
      

      然后继续使用您的原始代码,之后

          print(etree.tostring(tree).decode())
      

      将输出:

          <super_root><foo>
        </foo></super_root>
      

      如果需要,您还可以删除包装标签。

      正如我所说,不是很优雅,但确实可以。

      【讨论】:

      • 这不适用于带有 XML 声明的 XML 文件
      • 澄清了这个问题。
      猜你喜欢
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 2011-01-05
      相关资源
      最近更新 更多