【问题标题】:Why does ElementTree.iterparse sometimes retrieve XML elements incompletely?为什么 ElementTree.iterparse 有时会不完整地检索 XML 元素?
【发布时间】:2021-05-02 05:55:07
【问题描述】:

我正在解析一个太大而无法完全加载到内存中的 XML 文件,所以我使用 xml.etree.ElementTree.iterparse 来解析它。

我遇到的问题是有时,当我从迭代器中检索一个元素时,我发现我的 XML 文件中存在的一些信息被 ElementTree 忽略了。这是预期的行为吗?

一个例子

...
<car>
    <engine>
        <part name="pump"\>
        <part name="ECU"\>
    </engine>
</car>
...

假设我用xml.etree.ElementTree.iterparse 迭代器解析上面的XML sn-p。在给定的实例中,迭代器给了我元素 elem,它指向 XML car 元素。

然后,我执行xml.etree.ElementTree.dump(elem) 以查看elem 捕获实际XML 数据的能力,我得到:

<car>
    <engine>
        <part name="pump"/>
        <part/>
    </engine>
<car>

现在,请注意第二个 part 元素的名称是如何未被捕获的。为什么会发生这种情况,我该如何解决?

【问题讨论】:

标签: python xml elementtree iterparse


【解决方案1】:

经过更深入的搜索,我发现人们在使用解析迭代器解析大型文档时也报告了其他 xml 解析库的此问题。

事实证明,当您在“开始”事件上处理元素时,该元素可能没有完全加载。解决问题的方法是在“结束”事件上处理元素。

Andreas 题为"lxml.etree iterparse() and parsing element completely" 的问题中,我借用以下引用,我追踪到它来自a tutorial on lxml

“请注意,当收到开始事件时,元素的文本、尾部和子项不一定存在。只有结束事件才能保证元素已被完全解析。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2011-03-28
    • 2018-07-16
    • 2019-12-22
    相关资源
    最近更新 更多