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

Jen*_*ree 5 python xml xpath dom

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

我尝试过以下方面:

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

for element in commentElements:
    element.parentNode.remove(element)
Run Code Online (Sandbox Code Playgroud)

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

我知道有很多方法可以使用其他方法(如sed)轻松编辑文件,但我必须在python脚本中完成.

mzj*_*zjn 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)
Run Code Online (Sandbox Code Playgroud)

输出:

<root>
  <x>TEXT 1</x>
  <y>TEXT 2 </y>
</root>
Run Code Online (Sandbox Code Playgroud)


ctj*_*tj2 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)
Run Code Online (Sandbox Code Playgroud)

输出:

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

<x>TEXT 1</x>
<y>TEXT 2 </y>
</root>
Run Code Online (Sandbox Code Playgroud)


小智 6

一样

/sf/answers/232190591/

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)
Run Code Online (Sandbox Code Playgroud)

  • `remove_comments=True` 工作正常,但它没有在链接的答案中使用。那为什么说它是“相同的”呢? (2认同)