用Python与minidom获取元素值

我正在Python中为Eve Online API创build一个GUI前端。

我已经成功地从他们的服务器拉出XML数据。

我试图从名为“name”的节点获取值:

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

这似乎find节点,但输出如下:

 [<DOM Element: name at 0x11e6d28>] 

我怎么能得到它打印节点的价值?

它应该是

 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'; 因此“”.join()。 你可能想用换行符replace空格,或者可以不加任何东西。

你可以使用这样的东西,它为我工作

 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 

为了find这个我使用了以下内容:

 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文件创build与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]。数据

XML应该是简单的,它真的是,我不知道为什么python的迷你吧这么复杂…但它是如何制作的

这里是Henrik's对多个节点稍作修改的答案(即,当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)