使用 lxml etree 直接访问元素和属性
access elements and attribs DIRECTLY using lxml etree
给定以下 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 文档,因为我必须首先验证 xml 架构与 XSD 文档,我不想再次重新解析整个文档。
find
(和 findall
)也允许您指定元素的路径,例如您可以这样做:
root = ET.fromstring(input_xml)
for a in root.findall('a'):
print(a, a.find('from/b').text)
假设您总是只有一个 from
和 b
元素。
否则,我可能会想使用 findall
并在 Python 代码中进行检查,如果这被设计得更健壮
给定以下 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 文档,因为我必须首先验证 xml 架构与 XSD 文档,我不想再次重新解析整个文档。
find
(和 findall
)也允许您指定元素的路径,例如您可以这样做:
root = ET.fromstring(input_xml)
for a in root.findall('a'):
print(a, a.find('from/b').text)
假设您总是只有一个 from
和 b
元素。
否则,我可能会想使用 findall
并在 Python 代码中进行检查,如果这被设计得更健壮