0

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

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

一个例子

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

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

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

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

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

4

1 回答 1

0

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

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

Andreas题为“lxml.etree iterparse() and parsing element fully”的问题中,我借用了下面的引用,我追踪到它来自关于 lxml 的教程

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

于 2021-01-28T15:57:17.163 回答