使用lxml etree

时间:2018-10-06 17:36:13

标签: python parsing lxml

给出以下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模式,而我不想再次重新分析整个文档。

1 个答案:

答案 0 :(得分:2)

find(和findall)还可以指定元素的路径,例如,您可以执行以下操作:

root = ET.fromstring(input_xml)

for a in root.findall('a'):
    print(a, a.find('from/b').text)

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

否则,我可能会倾向于使用findall并在Python代码中进行检查,如果这样做设计得更强大