【发布时间】:2022-01-24 23:37:46
【问题描述】:
我是 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 的流数据,希望它甚至不知道该元素存在,但我遇到了问题。任何方向将不胜感激。
【问题讨论】:
-
您的内存峰值有多大?文字有多大?
-
您在这个问题上取得了进展吗?有任何解决方案有帮助吗?
标签: python-3.x xml xml-parsing lxml iterparse