如何使用 lxml 删除 XML 文档根元素之外的注释
How do I remove a comment outside of the root element of an XML document using lxml
我有一些 Python,我正试图从我无法控制的各种 XML 文档中删除所有评论。这应该能够处理任何有效的 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()
returns None
对该评论。我没有看到关于如何从 XML 树中删除节点的任何其他文档。这个is valid XML。那么我该如何删除这条评论呢?
如果你在用 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>
如果需要,您还可以删除包装标签。
正如我所说,不是很优雅,但可以做到。
要删除所有评论,请使用 XMLParser
和 remove_comments=True
。
from lxml import etree
parser = etree.XMLParser(remove_comments=True)
tree = etree.parse("test.xml", parser)
我有一些 Python,我正试图从我无法控制的各种 XML 文档中删除所有评论。这应该能够处理任何有效的 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()
returns None
对该评论。我没有看到关于如何从 XML 树中删除节点的任何其他文档。这个is valid XML。那么我该如何删除这条评论呢?
如果你在用 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>
如果需要,您还可以删除包装标签。
正如我所说,不是很优雅,但可以做到。
要删除所有评论,请使用 XMLParser
和 remove_comments=True
。
from lxml import etree
parser = etree.XMLParser(remove_comments=True)
tree = etree.parse("test.xml", parser)