2012-07-09 33 views
3

我有ElementTree.iter()的問題。使用ElementTree在Python中處理XML

所以,我想這個例子在這個環節:http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python-with-elementtree/

因此,這裏是我已經試過:

import elementtree.ElementTree as ET 
tree = ET.parse('XML_file.xml') 
root = tree.getroot() 
for elem in tree.iter(): 
    print elem.tag, elem.attrib 

而且我得到這個錯誤AttributeError的:ElementTree的實例有「國際熱核實驗堆

沒有屬性

附加信息:我的Python版本是2.4我分別安裝了elementtree。我提供的鏈接中的其他示例是在我的Python中安裝的。只有ElementTree.iter()不起作用。在此先感謝您的幫助。乾杯!

+0

可能重複[ElementTree中的國際熱核實驗堆()相當於python2.6的(http://stackoverflow.com/questions/7616800/elementtrees-iter-equivalent-in-python2-6) – 2012-07-09 07:31:05

+0

任何特別的原因你必須使用Python 2.4?真的,真的很老。 – millimoose 2012-07-09 11:19:50

回答

19

在你的情況,你應該更換.iter()通過.getiterator(),你可能應該叫它爲root元素,而不是樹(但我不知道,因爲我沒有了Python 2.4和模塊在我的手)。

import elementtree.ElementTree as ET 
tree = ET.parse('XML_file.xml') 
root = tree.getroot() 
for elem in root.getiterator(): 
    print elem.tag, elem.attrib 

這是Python 2.7中棄用的舊功能。對於Python 2.7,則.iter()應與內置模塊的工作:

import xml.etree.ElementTree as ET 
tree = ET.parse('XML_file.xml') 
root = tree.getroot() 
for elem in root.iter(): 
    print elem.tag, elem.attrib 

一個側面說明:標準模塊還支持通過元素節點(直接迭代即沒有.iter()或任何方法調用,只是for elem in root:)。它與.iter()不同 - 它只通過直接的後代節點。在舊版本中實現類似的功能,如.getchildren()

+0

好的,謝謝你,我會在我回家的時候試試這個,我會盡快更新你的。再次感謝! – neo 2012-07-09 10:02:36

+0

我試過getiterator(),但調用了根文件夾的所有子項。我怎樣稱呼一個孩子的子元素? – neo 2012-07-10 07:02:35

+0

是的,'.iter()'和'.getiterator()'是這樣定義的。 '.getchildren()'返回一個只有節點的孩子(沒有孫子)的列表。您可能對也可用於Python 2.4的lxml(http://lxml.de/)感興趣,它具有相同的API,但也實現了XPath 1.0表達式。 – pepr 2012-07-10 08:00:55

0

根據python文檔,這個API應該在2.5中,但它不存在。 您可以使用下面提到的代碼進行迭代。這樣你也可以傳遞標籤。

def iter(element, tag=None): 
    if tag == "*": 
     tag = None 
    if tag is None or element.tag == tag: 
     yield element 
    for e in element._children: 
     for e in e.iter(tag): 
      yield e