Obtener valor de elemento con minidom con Python

Estoy creando una interfaz gráfica de usuario para la API de Eve Online en Python.

He sacado con éxito los datos XML de su servidor.

Estoy tratando de tomar el valor de un nodo llamado “nombre”:

from xml.dom.minidom import parse dom = parse("C:\\eve.xml") name = dom.getElementsByTagName('name') print name 

Esto parece encontrar el nodo, pero la salida es a continuación:

 [] 

¿Cómo podría obtenerlo para imprimir el valor del nodo?

Simplemente debería ser

 name[0].firstChild.nodeValue 

Probablemente algo como esto si lo que quieres es la parte del texto …

 from xml.dom.minidom import parse dom = parse("C:\\eve.xml") name = dom.getElementsByTagName('name') print " ".join(t.nodeValue for t in name[0].childNodes if t.nodeType == t.TEXT_NODE) 

La parte de texto de un nodo se considera un nodo en sí mismo colocado como un nodo secundario del que usted solicitó. Por lo tanto, deseará recorrer todos sus elementos secundarios y buscar todos los nodos secundarios que sean nodos de texto. Un nodo puede tener varios nodos de texto; p.ej.

  blabla asdf znylpx  

Quieres tanto ‘blabla’ como ‘znylpx’; de ahí el “” .join (). Es posible que desee reemplazar el espacio con una nueva línea más o menos, o tal vez por nada.

Puedes usar algo como esto. Me funcionó.

 doc = parse('C:\\eve.xml') my_node_list = doc.getElementsByTagName("name") my_n_node = my_node_list[0] my_child = my_n_node.firstChild my_text = my_child.data print my_text 

Sé que esta pregunta es bastante antigua ahora, pero pensé que podría ser más fácil con ElementTree

 from xml.etree import ElementTree as ET import datetime f = ET.XML(data) for element in f: if element.tag == "currentTime": # Handle time data was pulled currentTime = datetime.datetime.strptime(element.text, "%Y-%m-%d %H:%M:%S") if element.tag == "cachedUntil": # Handle time until next allowed update cachedUntil = datetime.datetime.strptime(element.text, "%Y-%m-%d %H:%M:%S") if element.tag == "result": # Process list of skills pass 

Sé que no es muy específico, pero lo acabo de descubrir, y hasta ahora es mucho más fácil de entender que el minidom (ya que muchos nodos son esencialmente espacios en blanco).

Por ejemplo, tiene el nombre de la etiqueta y el texto real juntos, como es de esperar:

 >>> element[0]  >>> element[0].tag 'currentTime' >>> element[0].text '2010-04-12 02:45:45'e 

La respuesta anterior es correcta, a saber:

 name[0].firstChild.nodeValue 

Sin embargo, para mí, como otros, mi valor estaba más abajo en el árbol:

 name[0].firstChild.firstChild.nodeValue 

Para encontrar esto utilicé lo siguiente:

 def scandown( elements, indent ): for el in elements: print(" " * indent + "nodeName: " + str(el.nodeName) ) print(" " * indent + "nodeValue: " + str(el.nodeValue) ) print(" " * indent + "childNodes: " + str(el.childNodes) ) scandown(el.childNodes, indent + 1) scandown( doc.getElementsByTagName('text'), 0 ) 

Ejecutar esto para mi simple archivo SVG creado con Inkscape esto me dio:

 nodeName: text nodeValue: None childNodes: [] nodeName: tspan nodeValue: None childNodes: [] nodeName: #text nodeValue: MY STRING childNodes: () nodeName: text nodeValue: None childNodes: [] nodeName: tspan nodeValue: None childNodes: [] nodeName: #text nodeValue: MY WORDS childNodes: () 

Usé xml.dom.minidom, los diversos campos se explican en esta página, MiniDom Python.

Tuve un caso similar, lo que funcionó para mí fue:

name.firstChild.childNodes [0] .data

Se supone que XML es simple y realmente lo es, y no sé por qué el minidom de Python lo hizo tan complicado … pero es así como está hecho

Aquí hay una respuesta ligeramente modificada de Henrik para múltiples nodos (es decir, cuando getElementsByTagName devuelve más de una instancia)

 images = xml.getElementsByTagName("imageUrl") for i in images: print " ".join(t.nodeValue for t in i.childNodes if t.nodeType == t.TEXT_NODE) 

La pregunta ha sido respondida, mi contribución consiste en aclarar una cosa que puede confundir a los principiantes:

Algunas de las respuestas sugeridas y correctas usaron firstChild.data y otras usaron firstChild.nodeValue en firstChild.nodeValue lugar. En caso de que se pregunte cuál es la diferencia entre ellos, debe recordar que hacen lo mismo porque nodeValue es solo un alias para los data .

La referencia a mi statement se puede encontrar como un comentario en el código fuente de minidom :

# nodeValue es un alias para data