用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)