2014-10-17 101 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