从XML文件中删除所有注释的Python脚本

从XML文件中删除所有注释的Python脚本,python,xml,dom,xpath,Python,Xml,Dom,Xpath,我正在尝试构建一个python脚本,它将接收XML文档并从中删除所有注释块 我尝试了以下几点: tree = ElementTree() tree.parse(file) commentElements = tree.findall('//comment()') for element in commentElements: element.parentNode.remove(element) 这样做会从python中产生一个奇怪的错误:“KeyError:'()” 我知道有一些方法

我正在尝试构建一个python脚本,它将接收XML文档并从中删除所有注释块

我尝试了以下几点:

tree = ElementTree()
tree.parse(file)
commentElements = tree.findall('//comment()')

for element in commentElements:
    element.parentNode.remove(element)
这样做会从python中产生一个奇怪的错误:“KeyError:'()”

我知道有一些方法可以使用其他方法(如sed)轻松编辑文件,但我必须在python脚本中进行编辑。

comment()
是ElementTree不支持的XPath节点测试

您可以将
comment()
一起使用。此库非常类似于ElementTree,并且完全支持XPath 1.0

以下是使用lxml删除注释的方法:

从lxml导入etree
XML=”“”
文本1
文本2
"""
tree=etree.fromstring(XML)
comments=tree.xpath(“//comment()”)
对于评论中的c:
p=c.getparent()
p、 删除(c)
打印etree.tostring(树)
输出:

<root>
  <x>TEXT 1</x>
  <y>TEXT 2 </y>
</root>
<root>
<!-- COMMENT 1 -->
<x>TEXT 1</x>
<y>TEXT 2 <!-- COMMENT 2 --></y>
</root>
<root>

<x>TEXT 1</x>
<y>TEXT 2 </y>
</root>

文本1
文本2

这是我使用minidom实现的解决方案:

 def removeCommentNodes(self):
        for tag in self.dom.getElementsByTagName("*"):
            for n in tag.childNodes:
                if n.nodeType is dom.Node.COMMENT_NODE:
                    n.parentNode.removeChild(n)
实际上,我首先检索xml中的所有标记,然后针对每个标记查找注释节点,如果找到,我将删除它们。(self.dom是对已解析xml的引用)

使用lxml.etree中的strip_tags()

from lxml import etree
XML = """<root>
  <!-- COMMENT 1 -->
  <x>TEXT 1</x>
  <y>TEXT 2 <!-- COMMENT 2 --></y>
  </root>"""

tree = etree.fromstring(XML)
print etree.tostring(tree)
etree.strip_tags(tree,etree.Comment)
print etree.tostring(tree)
从lxml导入etree
XML=”“”
文本1
文本2
"""
tree=etree.fromstring(XML)
打印etree.tostring(树)
etree.strip_标记(树,etree.Comment)
打印etree.tostring(树)
输出:

<root>
  <x>TEXT 1</x>
  <y>TEXT 2 </y>
</root>
<root>
<!-- COMMENT 1 -->
<x>TEXT 1</x>
<y>TEXT 2 <!-- COMMENT 2 --></y>
</root>
<root>

<x>TEXT 1</x>
<y>TEXT 2 </y>
</root>

文本1
文本2
文本1
文本2
与相同


您可以添加一个小示例XML文档吗?
“//comment()”
似乎不是有效的搜索路径格式,并且正在导致KeyError。您可以包含该XML示例并扩展您试图捕获的模式吗?
comment()
是ElementTree不支持的XPath节点测试。Try完全支持XPath 1.0。lxml还实现了etree接口,AFAIK
remove_comments=True
工作正常,但链接答案中没有使用它。那么,为什么说它“相同”?