Script de Python para eliminar todos los comentarios del archivo XML

Estoy tratando de construir un script en python que tome un documento XML y elimine todos los bloques de comentarios de él.

Intenté algo a lo largo de las líneas de:

tree = ElementTree() tree.parse(file) commentElements = tree.findall('//comment()') for element in commentElements: element.parentNode.remove(element) 

Hacer esto produce un error extraño de python: “KeyError: ‘()’

Sé que hay maneras de editar fácilmente el archivo usando otros métodos (como sed), pero tengo que hacerlo en un script de python.

comment() es una prueba de nodo XPath que no es compatible con ElementTree.

Puedes usar comment() con lxml . Esta biblioteca es bastante similar a ElementTree y tiene soporte completo para XPath 1.0.

Aquí es cómo puede eliminar comentarios con lxml:

 from lxml import etree XML = """  TEXT 1 TEXT 2  """ tree = etree.fromstring(XML) comments = tree.xpath('//comment()') for c in comments: p = c.getparent() p.remove(c) print etree.tostring(tree) 

Salida:

  TEXT 1 TEXT 2   

Utilice strip_tags () de lxml.etree

 from lxml import etree XML = """  TEXT 1 TEXT 2  """ tree = etree.fromstring(XML) print etree.tostring(tree) etree.strip_tags(tree,etree.Comment) print etree.tostring(tree) 

Salida:

   TEXT 1 TEXT 2    TEXT 1 TEXT 2   

Lo mismo que

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) 

Esta es la solución que implementé usando 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) 

En la práctica, primero recupero todas las tags en el xml, luego, para cada etiqueta, busco nodos de comentarios y, si los encuentro, los elimino. (self.dom es una referencia al xml analizado)