使用 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)

假设您总是只有一个 fromb 元素。

否则,我可能会想使用 findall 并在 Python 代码中进行检查,如果这被设计得更健壮