Получить значение элемента с помощью minidom с Python
Я создаю интерфейс GUI для EVE Online API в Python.
Я успешно вытащил XML-данные с их сервера.
Я пытаюсь схватить значение из узла под названием "Имя":
from xml.dom.minidom import parse
dom = parse("C:eve.xml")
name = dom.getElementsByTagName('name')
print name
это, кажется, найти узел, но вывод ниже:
[<DOM Element: name at 0x11e6d28>]
Как я могу заставить его напечатать значение узла?
8 ответов:
наверное, что-то вроде этого, если это часть текста...
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'; следовательно,"".присоединяться.)( Возможно, вы захотите заменить пробел новой строкой или так, или, возможно, ничего.
вы можете использовать что-то вроде this.It сработало для меня
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 Python.
У меня был похожий случай, что сработало для меня было:
имя.возвращение null.childNodes[0].данные
XML должен быть простым, и это действительно так, и я не знаю, почему minidom python сделал это так сложно... но так уж оно устроено
вот немного измененный ответ Хенрика для нескольких узлов (т. е. когда 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.ссылка на мое заявление может быть найдена как комментарий к исходный код минидом:
#
nodeValueпсевдонимdata
Comments