ElementTree的findtext无法找到叶节点
我正在使用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')