Python 使用lxml etree直接访问元素和属性
给定以下xml结构:Python 使用lxml etree直接访问元素和属性,python,parsing,lxml,Python,Parsing,Lxml,给定以下xml结构: <root> <a> <from name="abc"> <b>xxx</b> <c>yyy</c> </from> <to name="def"> <b>blah blah</b> <c
<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>
xxx
yyy
废话
又是废话
如何直接访问每个“a”的“from.b”值而不首先加载每个“a”的“from”(使用find())呢
正如您所看到的,“from”和“to”下有完全相同的元素。因此findall()方法不起作用,因为我必须区分“b”的值来自何处
我希望获得直接访问的方法,因为如果我必须加载每个子元素(有很多),我的代码将非常冗长。此外,在我的例子中,性能很重要,我有很多XML文档要解析!因此,我必须找到最快的方法来浏览文档(并将数据存储到数据库中)
在每个“a”元素中,正好有一个“from”元素,在每个“from”元素中,正好有一个“b”元素
使用lxml objectify可以做到这一点,但我想使用etree,因为首先我必须使用etree解析XML文档,因为我必须首先根据XSD文档验证XML模式,并且我不想再次重新解析整个文档 find
(和findall
)也允许您指定元素的路径,例如,您可以执行以下操作:
root = ET.fromstring(input_xml)
for a in root.findall('a'):
print(a, a.find('from/b').text)
假设您始终只有一个from
和b
元素
否则,我可能会尝试使用findall
,并在Python代码中进行检查,如果这是为了更加健壮而设计的find
(并且findall
)也允许您指定元素的路径,例如,您可以执行以下操作:
root = ET.fromstring(input_xml)
for a in root.findall('a'):
print(a, a.find('from/b').text)
假设您始终只有一个from
和b
元素
否则,我可能会尝试使用findall
,并在Python代码中进行检查,如果这是为了更健壮的root。findall('a/from/b')
也会在a
父根中使用祖先查找所有“b”
a
parent中的祖先