我正在为Python中的Eve Online API创建一个GUI前端.
我已成功从其服务器中提取XML数据.
我试图从名为"name"的节点中获取值:
from xml.dom.minidom import parse dom = parse("C:\\eve.xml") name = dom.getElementsByTagName('name') print name
这似乎找到了节点,但输出如下:
[]
我怎么能让它打印节点的值?
它应该是
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)
节点的文本部分被视为一个节点,它本身被放置为您要求的节点的子节点.因此,您将希望遍历其所有子节点并查找作为文本节点的所有子节点.一个节点可以有几个文本节点; 例如.
blabla asdf znylpx
你想要'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
以上答案是正确的,即:
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 )
为我用Inkscape创建的简单SVG文件运行这个,这给了我:
nodeName: text nodeValue: None childNodes: [] nodeName: tspan nodeValue: None childNodes: [ ] nodeName: #text nodeValue: MY STRING childNodes: () nodeName: text nodeValue: None childNodes: [ ] nodeName: tspan nodeValue: None childNodes: [ ] nodeName: #text nodeValue: MY WORDS childNodes: ()
我使用了xml.dom.minidom,这个页面上解释了各种字段,MiniDom Python.
我知道这个问题现在很老了,但我想你可能会更容易使用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[0].tag 'currentTime' >>> element[0].text '2010-04-12 02:45:45'e