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 losdata
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