2013-04-24 78 views
0

我正在解析Python中的XML表單。 XML有這樣的結構:Python minidom:如何訪問元素

<layer1> 
    <layer2> 
     <element> 
      <info1></info1> 
     </element> 
     <element> 
      <info1></info1> 
     </element> 
     <element> 
      <info1></info1> 
     </element> 
    </layer2> 
</layer1> 

沒有layer2,我沒有問題來訪問info1中的數據。但是在第二層,我真的很麻煩。他們我可以ADRESS INFO1有:root.firstChild.childNodes[0].childNodes[0].data

所以我的想法是,我可以做到這一點similiar這樣的:root.firstChild.firstChild.childNodes[0].childNodes[0].data

##########方案

所以我這是怎麼解決我的問題: 從xml.etree進口cElementTree作爲ET

從xml.etree進口cElementTree作爲ET

tree = ET.parse("test.xml") 
root = tree.getroot() 

for elem in root.findall('./layer2/'): 
    for node in elem.findall('element/'): 
     x = node.find('info1').text 
     if x != "abc": 
      elem.remove(node) 
+0

你*有*使用minidom命名,而不是任何理由的ElementTree API? – 2013-04-24 15:49:13

回答

0

不要使用minidom API,如果你能幫助它。改爲使用ElementTree API;在xml.dom.minidom documentation explicitly states that

用戶誰是不是已經熟練使用DOM應該考慮使用xml.etree.ElementTree模塊的XML處理來代替。

這裏是使用ElementTree API來訪問自己的元件短樣品:

from xml.etree import ElementTree as ET 

tree = ET.parse('inputfile.xml') 

for info in tree.findall('.//element/info1'): 
    print info.text 

此使用XPath表達式來列出包含在element元件內部的所有info1元件,而不論其位置的在整個XML文檔中。

如果你需要的是第一info1元素,使用.find()

print tree.find('.//info1').text 

隨着DOM API,.firstChild很容易被Text節點,而不是Element節點;你總是需要循環的.childNotes順序找到的第Element比賽:

def findFirstElement(node): 
    for child in node.childNodes: 
     if child.nodeType == node.ELEMENT_NODE: 
      return child 

但對於你的情況,可能使用.getElementsByTagName()足夠:

root.getElementsByTagName('info1').data 
+0

謝謝,這有助於我:) 快速的問題: '在root.findall上下文(」 .//元/ ')!=信息context.find(' INFO1' )文本 如果信息=一: root.remove(上下文)' 不工作。它說,它不在列表中? – Leagis 2013-04-29 07:30:16

+0

好吧,我想通過自己的解決方案:)謝謝你的支持傢伙!我會編輯這個問題來收集我的結果 – Leagis 2013-04-29 07:45:29

+0

@FlorianKanus:不,不要編輯你的問題(因爲這是你的問題!)相反,只要接受最好的答案(就像你已經完成)或者編寫你自己的問題。 – 2013-06-17 05:53:45

0

工作的呢? (我不是在驚人蟒蛇只是一個快的想法)

name[0].firstChild.nodeValue