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