Ответ 1
Это должно быть просто
name[0].firstChild.nodeValue
Я создаю интерфейс GUI для API Eve Online в Python.
Я успешно вытащил данные XML со своего сервера.
Я пытаюсь захватить значение из node под названием "name":
from xml.dom.minidom import parse
dom = parse("C:\\eve.xml")
name = dom.getElementsByTagName('name')
print name
Это похоже на node, но результат ниже:
[<DOM Element: name at 0x11e6d28>]
Как я могу заставить его напечатать значение node?
Это должно быть просто
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)
Текстовая часть node считается node сама по себе помещена как дочерний элемент node той, которую вы просили. Таким образом, вы захотите пройти через все его дочерние элементы и найти все дочерние узлы, являющиеся текстовыми узлами. A node может иметь несколько текстовых узлов; например.
<name>
blabla
<somestuff>asdf</somestuff>
znylpx
</name>
Вы хотите "blabla" и "znylpx"; следовательно, ".join(). Возможно, вы захотите заменить пространство символом новой строки или, возможно, ничем.
вы можете использовать что-то вроде этого. Это сработало для меня
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
Я знаю, что это не суперспецифично, но я только что обнаружил его, и до сих пор мне намного легче обвести голову, чем мини-диск (так как многие узлы по существу являются белым).
Например, у вас есть имя тега и фактический текст вместе, как и следовало ожидать:
>>> 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.dom.minidom, различные поля описанные на этой странице, MiniDom Python.
У меня был похожий случай, что сработало для меня:
name.firstChild.childNodes [0].datap >
XML должен быть простым, и это действительно так, и я не знаю, почему мини-класс 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)
Это должно работать:
from xml.dom.minidom import parse
doc = minidom.parseString("C:\\eve.xml")
name = doc.getElementsByTagName('name')
print(name)