ElementTree - findall 对于所有子元素的递归选择

Python 代码:


import xml.etree.ElementTree as ET
root = ET.parse/"h.xml"/
print root.findall/'saybye'/


h.xml 代码:


<hello>
<saybye>
<saybye>
</saybye>
</saybye>
<saybye>
</saybye>
</hello>


代码输出


[<element 'saybye'="" 0x7fdbcbbec690="" at="">, <element 'saybye'="" 0x7fdbcbbec790="" at="">]



saybye

, 这是另一个的后代
saybye

, 这里没有选择。 所以如何指导 findall 在树上递归下降 DOM 并收集所有三个元素
saybye

?
</element></element>
已邀请:

风见雨下

赞同来自:

从版本开始 2.7, 您可以使用
xml.etree.ElementTree.Element.iter

:


import xml.etree.ElementTree as ET
root = ET.parse/"h.xml"/
print root.iter/'saybye'/



https://docs.python.org/2/libr ... .iter

裸奔

赞同来自:

如果你不怕一点点 XPath, 您可以使用语法
//

, 这意味着查找任何后代节点:


import xml.etree.ElementTree as ET
root = ET.parse/"h.xml"/
print root.findall/'.//saybye'/


满的 XPath 不支持,但这是什么是:
https://docs.python.org/2/libr ... yntax

喜特乐

赞同来自:

引文
https://docs.python.org/2/libr ... ments
,


Element.findall//

只有标记的元素,即当前元素的直接子元素。

因为他只发现直接儿童,我们需要递归地找到这样的孩子


>>> import xml.etree.ElementTree as ET
>>>
>>> def find_rec/node, element, result/:
... for item in node.findall/element/:
... result.append/item/
... find_rec/item, element, result/
... return result
...
>>> find_rec/ET.parse/"h.xml"/, 'saybye', []/
[<element 'saybye'="" 0x7f4fce206710="" at="">, <element 'saybye'="" 0x7f4fce206750="" at="">, <element 'saybye'="" 0x7f4fce2067d0="" at="">]


甚至更好,使它成为这样的发电机功能


&gt;&gt;&gt; def find_rec/node, element/:
... for item in node.findall/element/:
... yield item
... for child in find_rec/item, element/:
... yield child
...
&gt;&gt;&gt; list/find_rec/ET.parse/"h.xml"/, 'saybye'//
[<element 'saybye'="" 0x7f4fce206a50="" at="">, <element 'saybye'="" 0x7f4fce206ad0="" at="">, <element 'saybye'="" 0x7f4fce206b10="" at="">]


</element></element></element></element></element></element>

奔跑吧少年

赞同来自:

Element.findall//

只有标记的元素,即当前元素的直接子元素。

我们需要递归地绕过所有子元素,以查找与元素对应的项目。


def find_rec/node, element/:
def _find_rec/node, element, result/:
for el in node.getchildren//:
_find_rec/el, element, result/
if node.tag == element:
result.append/node/
res = list//
_find_rec/node, element, res/
return res

要回复问题请先登录注册