使用Python使用minidom获取Element值

时间:2008-11-25 13:57:03

标签: python dom minidom

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

我已成功从服务器中提取XML数据。

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

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

这似乎找到了节点,但输出如下:

[<DOM Element: name at 0x11e6d28>]

我怎么能让它打印节点的值?

9 个答案:

答案 0 :(得分:138)

应该只是

name[0].firstChild.nodeValue

答案 1 :(得分:56)

如果它是您想要的文本部分,可能就是这样......

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()。您可能希望用换行符替换空格,或者可能无需替换。

答案 2 :(得分:11)

你可以使用这样的东西。它为我效劳

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

答案 3 :(得分:7)

我知道这个问题现在已经很久了,但我认为你可以更轻松地使用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

答案 4 :(得分:7)

上述答案是正确的,即:

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: [<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,各个字段为explained on this page, MiniDom Python.

答案 5 :(得分:2)

我有一个类似的案例,对我有用的是:

name.firstChild.childNodes [0]。数据

XML应该是简单的,它确实是,我不知道为什么python的minidom这么复杂......但它是如何制作的

答案 6 :(得分:2)

这是Henrik对多个节点的略微修改的答案(即,当getElementsByTagName返回多个实例时)

images = xml.getElementsByTagName("imageUrl")
for i in images:
    print " ".join(t.nodeValue for t in i.childNodes if t.nodeType == t.TEXT_NODE)

答案 7 :(得分:0)

问题已得到解答,我的贡献在于澄清一件可能会让初学者感到困惑的事情:

一些建议和正确的答案使用glDebugMessageCallback而其他人使用firstChild.data代替。如果您想知道它们之间有什么不同,您应该记住它们做同样的事情,因为firstChild.nodeValue只是nodeValue的别名。

可以在source code of minidom上找到对我的陈述的引用:

  

datanodeValue

的别名

答案 8 :(得分:0)

这是一棵树,可能有嵌套的元素。试试:

def innerText(self, sep=''):
    t = ""
    for curNode in self.childNodes:
        if (curNode.nodeType == Node.TEXT_NODE):
            t += sep + curNode.nodeValue
        elif (curNode.nodeType == Node.ELEMENT_NODE):
            t += sep + curNode.innerText(sep=sep)
    return t