我有一个这样的xml (只是一个例子):
<xml>
<page>
<lol>
</lol>
<lel>
</lel>
</page>
<page>
<lol>
</lol>
<lel>
</lel>
</page>
<page>
<lol>
</lol>
<lel>
</lel>
</page>
</xml>我需要一种方法来做这样的事情:
#Sax code
for page in something:
parse(page)我如何使用sax做到这一点?
xml文件包含30 of的数据。
发布于 2011-09-09 20:50:20
您可以在线程中使用sax解析器。当它检测到fage已满时,它会将其推送到队列中。在主线程中,遍历队列。
发布于 2011-09-09 19:28:14
不要使用SAX,而应使用ElementTree:
from xml.etree import cElementTree as ET
for event, elem in ET.iterparse("/path/to/your/file"):
if elem.tag == 'page':
# do your processing
elem.clear()elem.clear()调用很重要,否则会将所有处理过的元素都保存在内存中,最终也会消耗掉所有内存。element对象是类似于DOM的轻量级对象,因此与SAX相比,它们非常易于使用。
如果单个page元素太大而不能容纳您的内存,那么您将不得不恢复到SAX,但是我从您的示例中假设有许多小的page元素,而不是几个大的元素。
发布于 2012-09-16 22:05:23
对xml.sax执行此操作的最有效和最简单的方法是使用parser.feed()方法。
示例:
parser = xml.sax.make_parser()
parser.setContentHandler(YourContentHandler)
f = open('terribly_large.xml', 'r')
for line in f.xreadlines():
parser.feed(line)这可以确保您同时增量地读取文件,并增量地解析它。
由此产生的内存占用应该是最小的。
https://stackoverflow.com/questions/7360253
复制相似问题