如何用Python简单地拆分XML文件?

5 投票
2 回答
10197 浏览
提问于 2025-04-17 01:42

我有一段Python代码,用来解析XML文件,具体内容可以在这里查看。我知道,XML文件在内存中处理时会占用很多系统资源。我的解决方案在处理较小的XML文件时效果不错(比如200KB),但我现在有一个340MB的文件。

我开始研究StAX(拉取解析器)的实现,但时间紧迫,我想找一个更简单的方法来完成这个任务。

我明白如何将文件分成更小的块,但我该如何提取正确的元素呢?每次都输出主标签或头标签该怎么做?

比如,这就是文件的结构:

<?xml version="1.0" ?>
<!--Sample XML Document-->
<bookstore>
    <book Id="1">
      ....
      ....
    </book> 
    <book Id="2">
      ....
      ....
    </book> 
    <book Id="3">
      ....
      ....
    </book> 
    ....
    ....
    ....
    <book Id="n">
      ....
      ....
    </book> 
</bookstore>

我该如何为每1000个书籍元素创建新的XML文件,并包含头部数据?如果想看具体的代码和数据集,可以参考我在这里的另一个问题。非常感谢。

我只想避免一次性将整个数据集加载到内存中。我们能以流式的方式解析XML文件吗?我这样想对吗?

附注:我的情况类似于2009年提出的一个问题。一旦我找到更简单的解决方案,我会在这里发布答案。感谢你的反馈。

2 个回答

1

你可以使用 elementtree.iterparse 这个工具,每处理完一个书籍标签后就把它丢掉。

8

你可以逐步解析你的大XML文件

from xml.etree.cElementTree import iterparse

# get an iterable and turn it into an iterator
context = iter(iterparse("path/to/big.xml", events=("start", "end")))

# get the root element
event, root = next(context)
assert event == "start"

for event, elem in context:
    if event == "end" and elem.tag == "book":
       # ... process book elements ...
       root.clear()

撰写回答