首页 > 解决方案 > 如何在 python 中没有整个文件的情况下有效地检测 XML 模式

问题描述

我有一个非常大的提要文件,它作为 XML 文档 (5GB) 发送。在事先不知道其结构的情况下解析主要项目节点的结构的最快方法是什么?Python中是否有一种方法可以“即时”执行此操作,而无需将完整的xml加载到内存中?例如,如果我只是保存了文件的前 5MB(它本身就是无效的 xml,因为它没有结束标签)——有没有办法从中解析模式?


更新:我在这里包含了一个示例 XML 片段:https ://hastebin.com/uyaliciho​​w.xml 。我正在寻找类似于以下内容的数据框(或列表或您要使用的任何其他数据结构)之类的内容:

Items/Item/Main/Platform       Items/Item/Info/Name
iTunes                         Chuck Versus First Class
iTunes                         Chuck Versus Bo

怎么可能做到这一点?我在这里添加了一个赏金来鼓励答案。

标签: pythonxmlperformance

解决方案


有几个人曲解了这个问题,再读一遍,真的一点都不清楚。其实有几个问题。

如何检测 XML 模式

有些人将此解释为您认为文件中可能存在架构,或从文件中引用。我将其解释为您想从实例的内容中推断出模式。

在事先不知道其结构的情况下解析主要项目节点的结构的最快方法是什么?

只需将其通过解析器,例如 SAX 解析器。解析器不需要知道 XML 文件的结构即可将其拆分为元素和属性。但我认为您实际上并不想要尽可能快的解析(事实上,我认为性能在您的要求列表中根本没有那么高)。我认为您想对信息做一些有用的事情(您还没有告诉我们什么):也就是说,您想处理信息,而不仅仅是解析 XML。

是否有一个 python 实用程序可以“即时”执行此操作而无需将完整的 xml 加载到内存中?

是的,根据这个提到 Python 世界中 3 个基于事件的 XML 解析器的页面:https ://wiki.python.org/moin/PythonXml (我不能保证其中任何一个)

如果我只是保存了文件的前 5MB(它本身就是无效的 xml,因为它没有结束标签)怎么办——有没有办法从中解析模式?

我不确定您是否知道动词“解析”的实际含义。您的短语肯定表明您希望文件包含要提取的模式。但我完全不确定你是否真的是这个意思。在任何情况下,如果它确实在前 5Mb 中包含模式,您会发现它只是按顺序读取文件,无需先“保存”文件的第一部分。


推荐阅读