我是 xml 解析的新手,我一直试图找出一种跳过父元素内容的方法,因为有一个嵌套元素在其文本属性中包含大量数据(我无法更改此文件的方式生成)。这是 xml 的示例:
<root>
<Parent>
<thing_1>
<a>I need this</a>
</thing_1>
<thing_2>
<a>I need this</a>
</thing_2>
<thing_3>
<subgroup>
<huge_thing>enormous string here</huge_thing>
</subgroup>
</thing_3>
</Parent>
<Parent>
<thing_1>
<a>I need this</a>
</thing_1>
<thing_2>
<a>I need this</a>
</thing_2>
<thing_3>
<subgroup>
<huge_thing>enormous string here</huge_thing>
</subgroup>
</thing_3>
</Parent>
</root>
我已经尝试了 lxml.iterparse 和 xml.sax 实现来尝试解决这个问题,但没有骰子。这些是我在搜索中找到的大部分答案:
在 iterparse 中使用 tag 关键字。
这不起作用,因为尽管 lxml 在后台清理了元素,但元素中的大文本仍然被解析到内存中,所以我得到了很大的内存峰值。
如果找到该元素的开始事件,则创建一个将其设置为 True 的标志,然后在解析中忽略该元素。
这不起作用,因为元素在结束事件时仍被解析到内存中。
在到达特定元素的结束事件之前中断。
当我到达元素时,我不能只是打破,因为有多个这些元素需要特定的子数据。
这是不可能的,因为流解析器仍然有一个结束事件并生成完整的元素。
... 好的。
我目前正在尝试直接编辑 GzipFile 发送到 iterparse 的流数据,希望它甚至不知道该元素存在,但我遇到了问题。任何方向将不胜感激。