为什么 ElementTree.iterparse 有时会不完整地检索 XML 元素?

Why does ElementTree.iterparse sometimes retrieve XML elements incompletely?

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

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

一个例子

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

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

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

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

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

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

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

来自Andreas titled "lxml.etree iterparse() and parsing element completely", I borrow the following quote, which I tracked down as coming from a tutorial on lxml的问题:

"Note that the text, tail, and children of an Element are not necessarily present yet when receiving the start event. Only the end event guarantees that the Element has been parsed completely."