ElementTree findtext找不到叶子节点

时间:2014-10-17 16:16:41

标签: python xml elementtree

我正在使用ElementTree扫描从文本文件中提取的XML字符串。

<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 个答案:

答案 0 :(得分:3)

findtext使用ElementTree样式路径语句,因此您只扫描直接子项。这将扫描整个树(参见element xpath):

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

答案 1 :(得分:1)

我这样做:

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

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