ElementTree的findtext无法找到叶节点

2 投票
2 回答
5028 浏览
提问于 2025-04-28 03:55

我正在使用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 个回答

1

我这样做:

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

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

findtext使用了一种类似于ElementTree的路径语法,所以你只是在查找直接的子元素。这个方法会扫描整个树(详细信息可以查看element xpath):

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

撰写回答