2008-12-17 21 views
8

para el XMLCómo recuperar el nodo principal utilizando cElementTree?

<grandparent> 
    <parent1> 
    <child>data1</child> 
    </parent1> 
    <parent2> 
    <child>data2</child> 
    </parent2> 
</grandparent> 

Necesito la lista que contiene tuplas de los padres, los datos para cada padre en XML.

¿Hay alguna manera de hacerlo USANDO cElementTree? Puedo hacerlo para niños, datos, pero lamentablemente el niño es idéntico en todos los valores, por lo tanto, no sirve de mucho.

Respuesta

4

Parece que puede obtener acceso al elemento primario del elemento secundario utilizando la versión 1.3 de ElementTree (marque http://effbot.org/zone/element-xpath.htm), utilizando comandos xpath como child.find('../parent'). Pero creo que Python se envía con la versión 1.2 o algo así.

También debe comprobar para lxml que es compatible con etree y tiene pleno apoyo XPath http://lxml.de/

+0

Los documentos dicen algo así como 'Modificado en la versión 2.7: La API ElementTree se actualiza a 1.3. En http: //docs .python.org/2/library/xml.etree.elementtree Estoy usando 2.7, pero para mí ''../ myparent'' todavía no funciona; ¿Qué significa esto? – n611x007

+0

Sí, no creo que esto sea soporte en cElementTree. e.g .: ET.fromstring ("") .find ('.// ​​b'). find ('..') devuelve None –

+1

@AndySmith Creo que sé por qué no devuelve ninguno. El [doc dice] (https://docs.python.org/3/library/xml.etree.elementtree.html#supported-xpath-syntax): 'Selecciona el elemento padre. Devuelve None si la ruta intenta alcanzar los ancestros del elemento start (** el elemento find fue llamado en **). ' – Adrian

5
parent_map = dict((c, p) for p in tree.getiterator() for c in p) 
parent_map[el].remove(el) 
+0

+1. porque en elementTree, acceder al padre por '..' está roto o no funciona o de otra manera que yo no sé. ¡¡¡Así tu camino lo resolverá !!! también podemos hacerlo como '{c: p para p en tree.getiterator() para c en p}' – namit

+0

@namit Puedo confirmar esto. Puedo acceder correctamente a mis nodos pero cuando lo hago 'print ('parent =', el.findall (" ../ "))' que es como [esto] (https://docs.python.org/3/library /xml.etree.elementtree.html#supported-xpath-syntax) dijo así, obtengo objetos nulos. – Adrian

+0

@namit resulta que no leí correctamente la documentación para '..':' Selecciona el elemento padre. Devuelve None si la ruta intenta alcanzar a los ancestros del elemento start (se llamó al elemento find) .'' [link] (https://docs.python.org/3/library/xml.etree.elementtree.html# supported-xpath-sintaxis) – Adrian

0

Esta sintaxis parecía funcionar para cElementTree

ET.fromstring("<c><a><b></b></a></c>").find('.//b/..') 

No se va a base de los padres, y el uso de doble barra y luego solo barra en el camino.
(se habría publicado como un comentario en el hilo anterior, pero parece que no tengo ningún privilegio)

Cuestiones relacionadas