7

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

我尝试了一些类似的东西:

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

for element in commentElements:
    element.parentNode.remove(element)

这样做会从 python 产生一个奇怪的错误:“KeyError: '()'

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

4

4 回答 4

12

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>
于 2012-05-03T18:51:33.210 回答
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>
于 2013-08-29T17:13:52.717 回答
6

一样

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)
于 2013-11-12T21:51:44.760 回答
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 的引用)

于 2012-10-06T12:05:00.160 回答