我正在尝试构建一个python脚本,该脚本将接收XML文档并从中删除所有注释块。
我尝试了以下几点:
tree = ElementTree()
tree.parse(file)
commentElements = tree.findall('//comment()')
for element in commentElements:
element.parentNode.remove(element)
这样做会产生python的奇怪错误:“KeyError:'()'
我知道有很多方法可以使用其他方法(比如sed)轻松编辑文件,但我必须在python脚本中完成。
答案 0 :(得分:11)
comment()
是ElementTree不支持的XPath节点测试。
您可以将comment()
与 lxml 一起使用。这个库与ElementTree非常相似,它完全支持XPath 1.0。
以下是使用lxml删除注释的方法:
from lxml import etree
XML = """<root>
<!-- COMMENT 1 -->
<x>TEXT 1</x>
<y>TEXT 2 <!-- COMMENT 2 --></y>
</root>"""
tree = etree.fromstring(XML)
comments = tree.xpath('//comment()')
for c in comments:
p = c.getparent()
p.remove(c)
print etree.tostring(tree)
输出:
<root>
<x>TEXT 1</x>
<y>TEXT 2 </y>
</root>
答案 1 :(得分:8)
使用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)
输出:
<root>
<!-- COMMENT 1 -->
<x>TEXT 1</x>
<y>TEXT 2 <!-- COMMENT 2 --></y>
</root>
<root>
<x>TEXT 1</x>
<y>TEXT 2 </y>
</root>
答案 2 :(得分:4)
与
相同https://stackoverflow.com/a/3317008/1458574
from lxml import etree
import sys
XML = open(sys.argv[1]).read()
parser = etree.XMLParser(remove_comments=True)
tree= etree.fromstring(XML, parser = parser)
print etree.tostring(tree)
答案 3 :(得分:3)
这是我使用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的引用)