7

XML ドキュメントを取り込み、そこからすべてのコメント ブロックを削除する Python スクリプトを作成しようとしています。

私は次の行に沿って何かを試しました:

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ノードテストです。

lxmlcomment()で使用できます。このライブラリはElementTreeと非常によく似ており、XPath1.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 に答える