【问题标题】:access elements and attribs DIRECTLY using lxml etree使用 lxml etree 直接访问元素和属性
【发布时间】:2019-03-11 21:48:04
【问题描述】:

给定以下 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”(使用 find())的情况下直接访问每个“a”的“from.b”的值?

如您所见,“from”和“to”下的元素完全相同。所以 findall() 方法不起作用,因为我必须区分“b”的值来自哪里。

我想获得直接访问的方法,因为如果我必须加载每个子元素(有很多),我的代码会非常冗长。此外,在我的案例中,性能很重要,我还有很多 XML 文档要解析!所以我必须找到最快的方法来浏览文档(并将数据存储到数据库中)

在每个“a”元素中恰好有 1 个“from”元素,在每个“from”元素中恰好有 1 个“b”元素。

我对 lxml objectify 没有问题,但我想使用 etree,因为首先我必须使用 etree 解析 XML 文档,因为我必须首先针对 XSD 文档验证 xml 架构并且我不想再次重新解析整个文档。

【问题讨论】:

    标签: python parsing lxml


    【解决方案1】:

    find(和findall)还允许您指定元素的路径,例如,您可以这样做:

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

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

    否则,我可能会想使用findall 并检查 Python 代码是否旨在更健壮

    【讨论】:

    • root.findall('a/from/b') 还会在 a parent 中找到所有 "b""from" 祖先
    猜你喜欢
    • 2019-06-27
    • 2014-03-13
    • 1970-01-01
    • 2012-02-28
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多