2010-07-12 14 views
5

que analizo en el XML usandoAdición de atributos a los elementos existentes, la eliminación de elementos, etc con lxml

from lxml import etree 

tree = etree.parse('test.xml', etree.XMLParser()) 

Ahora quiero trabajar en el XML analizado. Estoy teniendo problemas para quitar elementos con espacios de nombres o sólo elementos en general, tales como

<rdf:description><dc:title>Example</dc:title></rdf:description> 

y quiero quitar ese elemento completo, así como todo lo que dentro de las etiquetas. También quiero agregar atributos a los elementos existentes también. Los métodos que necesito están en la clase Element, pero no tengo idea de cómo usar eso con el objeto ElementTree aquí. Cualquier punteros sin duda serán bienvenidos, gracias

Respuesta

14

Puede llegar al elemento raíz a través de esta llamada: root=tree.getroot()

Usando ese elemento raíz, puede utilizar findall() y eliminar los elementos que coinciden con su búsqueda:

deleteThese = root.findall("title") 
for element in deleteThese: root.remove(element) 

Por último, se puede ver lo que parece su nuevo árbol con esto: etree.tostring(root, pretty_print=True)

Aquí hay alguna información acerca de cómo encontrar trabajo/findall: http://infohost.nmt.edu/tcc/help/pubs/pylxml/class-ElementTree.html#ElementTree-find

Para añadir un atributo a un elemento, a intentar algo como esto:

root.attrib['myNewAttribute']='hello world' 
+0

alguna idea de cómo iba a encontrar etiquetas cobardes tales como ? – axsuul

+0

@axsuul ¿Has pensado en cómo agregar las etiquetas funky? –

+0

@ShreedharManek siento que haya pasado tanto tiempo desde este proyecto. No recuerdo! – axsuul

1

El método remove debe hacer lo que quiera:

>>> from lxml import etree 
>>> from StringIO import StringIO 

>>> s = '<Root><Description><Title>foo</Title></Description></Root>' 
>>> tree = etree.parse(StringIO(s)) 

>>> print(etree.tostring(tree.getroot())) 
<Root><Description><Title>foo</Title></Description></Root> 

>>> title = tree.find('//Title') 
>>> title.getparent().remove(title) 
>>> etree.tostring(tree.getroot()) 
'<Root><Description/></Root>' 

>>> print(etree.tostring(tree.getroot())) 
<Root><Description/></Root> 
Cuestiones relacionadas