2010-06-03 115 views
0

對不起,如果這是一個重複的問題或基本問題,因爲我是Python新手。我試圖解析下面的XML命令,以便我可以「提取」Daniel和George的標籤值。我希望答案看起來像Daniel = 78,George = 90.解析具有相似標籤和不同屬性的xml文件!

<epas:property name="Tom">12</epas:property> 
<epas:property name="Alice">34</epas:property> 
<epas:property name="John">56</epas:property> 
<epas:property name="Danial">78</epas:property> 
<epas:property name="George">90</epas:property> 
<epas:property name="Luise">11</epas:property> 

xml命令存儲在一個字符串中。即的myString所以這裏是代碼的第一部分,我試圖解析這個字符串(MyString的):

element = xml.dom.minidom.parseString(myString).getElementByTagName ("epas:property") 
if not element: 
    print "error message" 
else: 
    for el in element: 
     value [el.getAttribute("name")] = el.firstChild.data 

我想引用丹尼爾和喬治數組索引獲得的價值,但看起來我不是正確地做。我會很感激你對此的想法/評論。

歡呼聲中,比爾

+0

把XML和Python代碼,代碼格式,因此會正確顯示。 – 2010-06-03 18:47:22

+0

您是否收到錯誤? 如果將.getElementByTagName修復爲.getElementsByTagName,並且將該xml片段包裝在聲明名稱空間的根元素中,則其餘部分應該可以工作。如果沒有,你應該得到一個錯誤信息。 – 2010-06-03 19:04:55

+0

我正在嘗試逐字解析問題中顯示的XML嗎?如果是這樣,它不是有效的XML。需要有一個根元素來包含屬性項。這可能是你的問題的原因。 – 2010-06-03 19:12:38

回答

1

不要使用xml.dom.minidom,這是一個可怕的圖書館!使用ElementTreelxml(ElementTree位於標準庫中,可能對您工作正常)。

應該有一個XML命名空間,即類似xmlns:epas="http://something"。你也不能擁有裸露的元素,他們需要被封閉。如果你有「假」的命名空間(即沒有申報),你可以踢,做:

myString = '<doc xmlns:epas="dummy">%s</doc>' % myString 

隨着ElementTree的這件事情是這樣的:

import xml.etree.ElementTree as ET 
doc = ET.fromstring(myString) 
result = {} 
for el in doc.findall('{http://something}property): 
    result[el.get('name')] = int(el.text) 
+0

謝謝伊恩。我安裝了Python 2.5.4版本,但是我得到:「沒有名爲etree.ElementTree的模塊作爲ET」。正如你所說,ElenetTree是在標準庫中,所以應該使用Python 2.5.4!我在這裏錯過了什麼嗎? :-) – 2010-06-04 16:03:01

+0

2.5應包含ElementTree。在某些操作系統上,它*可能是一個單獨的安裝(即,打包程序將其從標準庫中分離出來)。你也可以只安裝ElementTree,然後'將ElementTree導入爲ET'。 – 2010-06-04 22:44:20

相關問題