2008-11-25 71 views
90

我正在爲Python中的Eve Online API創建一個GUI前端。用Python與minidom獲取元素值

我已經成功地從他們的服務器中提取XML數據。

我想抓住從一個節點稱爲「名稱」的值:

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

這似乎找到節點,但產量低於:

[<DOM Element: name at 0x11e6d28>] 

我怎麼能拿它打印節點的值?

+3

它開始看起來像大多數「迷你」問題的答案是「使用ElementTree」。 – 2012-11-27 16:16:00

回答

123

這應該只是

name[0].firstChild.nodeValue 
+3

當我做名字[0] .nodeValue回送「無」,只是爲了測試我通過它名稱[0] .nodeName,它給了我「名稱」這是正確的。有任何想法嗎? – RailsSon 2008-11-25 14:09:15

+27

怎麼樣name [0] .firstChild.nodeValue? – eduffy 2008-11-25 14:49:04

54

大概是這樣的,如果這是你想要的文字部分...

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()。你可能想用換行符替換空格,或者也許不加空格。

6

我知道這個問題是很老了,但我想你可能有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 
11

,你可以使用類似this.It摸索出適合我

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 
2

我也有類似的情況下,什麼工作對我來說是:

name.firstChild.childNodes [0]。數據

XML應該是簡單的,它確實是,我不知道爲什麼python的minidom做得如此複雜...但它是如何製作的

2

這是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) 
0

這應該工作:

from xml.dom.minidom import parse 

doc = minidom.parseString("C:\\eve.xml") 
name = doc.getElementsByTagName('name') 
print(name) 
4

以上回答是正確的,即:

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.