2014-10-17 41 views
2

我使用ElementTree掃描從文本文件中拉出的XML字符串。ElementTree findtext找不到葉節點

<root> 
    <branch_a> 
     <leaf>foo</leaf> 
    </branch_a> 
    <branch_b> 
     <another_leaf>bar</another_leaf> 
    </branch_b> 
</root> 

當我分析它,並試圖找到葉節點,我沒有得到任何結果:

>>> elem_tree = xml.etree.ElementTree.fromstring(xml_string) 
>>> leaf_text = elem_tree.findtext('leaf') 
>>> leaf_text is None 
True 

但是,當我遍歷樹,一切正常:

>>> elem_tree.findtext('branch_a/leaf') 
'foo' 

>>> branch = elem_tree.find('branch_a') 
>>> branch.findtext('leaf') 
'foo' 

有沒有一種方法讓ElementTree爲我掃描整棵樹?我的分支名稱是動態的,我尋找的葉子可以生活在任何分支下。

我能用minidom做到這一點,但遇到了其他限制。這裏是我在那裏做的,供參考(剝去錯誤檢查)。

>>> xml_doc = xml.dom.minidom.parseString(xml_string) 
>>> leaf_node = xml_doc.getElementsByTagName('leaf') 
>>> leaf_node[0].firstChild.nodeValue 
'foo' 

回答

2

findtext使用ElementTree風格的路徑語句,所以你只是在掃描直接的孩子。這將掃描整個樹(見element xpath):

leaf_text = elem_tree.findtext('.//leaf') 
+0

這是我錯過了什麼。謝謝! – 2014-10-17 17:28:42

1

我做這樣說:

leaf_text = elem_tree.findall('.//leaf') 

for x in range(0, len(leaf_text)): 
    print leaf_text[x].text