Получить значение элемента с помощью minidom с Python

Я создаю интерфейс GUI для EVE Online API в Python.

Я успешно вытащил данные XML с их сервера.

Я пытаюсь захватить значение из узла с именем "name":

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

это, кажется, находит узел, но вывод ниже:

[<DOM Element: name at 0x11e6d28>]

Как я могу заставить его напечатать значение узла?

8 ответов


Это должно быть просто

name[0].firstChild.nodeValue

наверное, что-то вроде этого, если это часть текста...

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)

текстовая часть узла считается узлом сама по себе, размещенным как дочерний узел того, который вы просили. Таким образом, вы захотите пройти через все его дочерние узлы и найти все дочерние узлы, которые являются текстовыми узлами. Узел может иметь несколько текстовых узлов; например.

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

вы хотите и "blabla" и "znylpx"; следовательно,"".присоединяться.)( Возможно, вы захотите заменить пробел новой строкой или около того, или, возможно, ничего.


вы можете использовать что-то вроде этого.Это сработало для меня

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

Я знаю, что этот вопрос довольно старый, но я думал, что вам может быть легче с 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

Я знаю, что это не супер специфично, но я только что обнаружил это, и до сих пор мне намного легче разобраться, чем в minidom (так как так много узлов по существу являются пробелами).

например, у вас есть имя тега и фактический текст вместе, как вы, вероятно, ожидаете:

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

приведенный выше ответ верен, а именно:

name[0].firstChild.nodeValue

однако для меня, как и для других, моя ценность была дальше по дереву:

name[0].firstChild.firstChild.nodeValue

чтобы найти это, я использовал следующее:

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 )

запуск этого для моего простого SVG-файла, созданного с помощью Inkscape, дал мне:

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: ()

я использовал xml.дом.minidom, различные поля являются объяснено на этой странице, MiniDom Python.


У меня был аналогичный случай, что сработало для меня было:

имя.возвращение null.childNodes[0].данные

XML должен быть простым, и это действительно так, и я не знаю, почему minidom python сделал это так сложно... но так уж оно устроено!--1-->


вот немного измененный ответ Хенрика для нескольких узлов (т. е. когда getElementsByTagName возвращает более одного экземпляра)

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

на вопрос был дан ответ, мой вклад состоит в прояснении одной вещи, которая может смутить начинающих:

некоторые из предложенных и правильные ответы firstChild.data и другие firstChild.nodeValue вместо. Если вам интересно, чем они отличаются друг от друга, вы должны помнить, что они делают то же самое, потому что nodeValue - это просто псевдоним для data.

ссылка на мое заявление может быть найдена в качестве комментария к исходный код минидом!--12-->:

#nodeValue псевдоним data