read leer example python dom minidom

leer - Obtenga valor de elemento con minidom con Python



python read xml file example (8)

Estoy creando una interfaz gráfica de usuario para Eve Online API 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 el resultado está a continuación:

[<DOM Element: name at 0x11e6d28>]

¿Cómo podría hacer que imprima el valor del nodo?


Aquí hay una respuesta ligeramente modificada de Henrik''s para nodos múltiples (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)


Debería ser solo

name[0].firstChild.nodeValue


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 usaban firstChild.data y otros, en firstChild.nodeValue lugar usaban firstChild.nodeValue . 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 declaración se puede encontrar como un comentario sobre el código fuente de minidom :

# nodeValue es un alias para los data


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 )

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

nodeName: text nodeValue: None childNodes: [<DOM Element: tspan at 0x10392c6d0>] nodeName: tspan nodeValue: None childNodes: [<DOM Text node "''MY STRING''">] nodeName: #text nodeValue: MY STRING childNodes: () nodeName: text nodeValue: None childNodes: [<DOM Element: tspan at 0x10392c800>] nodeName: tspan nodeValue: None childNodes: [<DOM Text node "''MY WORDS''">] nodeName: #text nodeValue: MY WORDS childNodes: ()

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


Probablemente algo así si es la parte de texto que quieres ...

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 hijo del que usted solicitó. Por lo tanto, querrá revisar todos sus elementos secundarios y encontrar todos los nodos secundarios que son nodos de texto. Un nodo puede tener varios nodos de texto; p.ej.

<name> blabla <somestuff>asdf</somestuff> znylpx </name>

Desea 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.


Sé que esta pregunta ya es bastante antigua, pero pensé que podría pasar un momento 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 súper específico, pero acabo de descubrirlo, y hasta ahora es mucho más fácil entender que el minidomo (ya que muchos nodos son esencialmente espacios en blanco).

Por ejemplo, tiene el nombre de la etiqueta y el texto real juntos, tal como probablemente esperaría:

>>> element[0] <Element currentTime at 40984d0> >>> element[0].tag ''currentTime'' >>> element[0].text ''2010-04-12 02:45:45''e


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 minidomo de Python lo hizo tan complicado ... pero así es como está hecho


puedes usar algo como esto. Funcionó para mí

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