给出以下xml结构:
<root>
<a>
<from name="abc">
<b>xxx</b>
<c>yyy</c>
</from>
<to name="def">
<b>blah blah</b>
<c>another blah blah</c>
</to>
</a>
</root>
我如何直接访问每个“ a”的“ from.b”的值而无需加载每个“ a”的第一个“ from”(使用find())?
如您所见,“ from”和“ to”下的元素完全相同。因此,findall()方法无法正常工作,因为我必须区分“ b”的值来自何处。
我想获得直接访问的方法,因为如果必须加载每个子元素(很多),我的代码将非常冗长。另外,就我而言,性能至关重要,我还有很多XML文档可以解析!所以我必须找到最快的方法来浏览文档(并将数据存储到数据库中)
在每个“ a”元素中恰好有1个“ from”元素,在每个“ from”元素中恰好有1个“ b”元素。
我使用lxml objectify可以做到这一点没有问题,但是我想使用etree,因为首先我必须使用etree解析XML文档,因为我必须首先针对XSD文档验证xml模式,而我不想再次重新分析整个文档。
答案 0 :(得分:2)
find
(和findall
)还可以指定元素的路径,例如,您可以执行以下操作:
root = ET.fromstring(input_xml)
for a in root.findall('a'):
print(a, a.find('from/b').text)
假设您确实总是只有一个from
和b
元素。
否则,我可能会倾向于使用findall
并在Python代码中进行检查,如果这样做设计得更强大