que libreria leer extraer datos con archivo python xml parsing minidom

libreria - minidom python



Lectura de XML usando Python minidom e iteraciĆ³n sobre cada nodo (5)

Acceso rapido:

node.getElementsByTagName(''author'')[0].childNodes[0].nodeValue

Tengo una estructura XML que se parece a la siguiente, pero a una escala mucho más grande:

<root> <conference name=''1''> <author> Bob </author> <author> Nigel </author> </conference> <conference name=''2''> <author> Alice </author> <author> Mary </author> </conference> </root>

Para esto, utilicé el siguiente código:

dom = parse(filepath) conference=dom.getElementsByTagName(''conference'') for node in conference: conf_name=node.getAttribute(''name'') print conf_name alist=node.getElementsByTagName(''author'') for a in alist: authortext= a.nodeValue print authortext

Sin embargo, el authortext que se imprime es ''Ninguno''. Intenté jugar con variaciones como las que se muestran a continuación, pero hace que mi programa se rompa.

authortext=a[0].nodeValue

El resultado correcto debería ser:

1 Bob Nigel 2 Alice Mary

Pero lo que obtengo es:

1 None None 2 None None

¿Alguna sugerencia sobre cómo abordar este problema?


Como siempre tiene un valor de datos de texto por autor, puede usar element.firstChild.data

dom = parseString(document) conferences = dom.getElementsByTagName("conference") # Each conference here is a node for conference in conferences: conference_name = conference.getAttribute("name") print print conference_name.upper() + " - " authors = conference.getElementsByTagName("author") for author in authors: print " ", author.firstChild.data # for print


Jugué un poco con esto, y esto es lo que tengo que trabajar:

# ... authortext= a.childNodes[0].nodeValue print authortext

que conduce a la salida de:

C:/temp/py>xml2.py 1 Bob Nigel 2 Alice Mary

No puedo decirle exactamente por qué tiene que acceder al childNode para obtener el texto interno, pero al menos eso es lo que estaba buscando.


Los nodos de elementos no tienen un valorNodo. Tienes que mirar los nodos de texto dentro de ellos. Si sabe que siempre hay un nodo de texto dentro, puede decir element.firstChild.data (data es lo mismo que nodeValue para nodos de texto).

Tenga cuidado: si no hay contenido de texto, no habrá hijos. Los nodos de texto y element.firstChild serán nulos, lo que hará que element.firstChild el acceso .data .

Forma rápida de obtener el contenido de los nodos directos de texto para niños:

text= ''''.join(child.data for child in element.childNodes if child.nodeType==child.TEXT_NODE)

En DOM Level 3 Core obtienes la propiedad textContent que puedes usar para obtener texto dentro de un elemento recursivamente, pero minidom no es compatible con esto (algunas otras implementaciones Python DOM lo hacen).


su authortext es de tipo 1 ( ELEMENT_NODE ), normalmente necesita tener TEXT_NODE para obtener una cadena. Esto funcionará

a.childNodes[0].nodeValue