首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SAX上迭代

在SAX上迭代
EN

Stack Overflow用户
提问于 2011-09-09 18:24:31
回答 4查看 475关注 0票数 0

我有一个这样的xml (只是一个例子):

代码语言:javascript
运行
复制
<xml>
  <page>
    <lol>
    </lol>
    <lel>
    </lel>
  </page>
  <page>
    <lol>
    </lol>
    <lel>
    </lel>
  </page>
  <page>
    <lol>
    </lol>
    <lel>
    </lel>
  </page>
</xml>

我需要一种方法来做这样的事情:

代码语言:javascript
运行
复制
#Sax code

for page in something:
  parse(page)

我如何使用sax做到这一点?

xml文件包含30 of的数据。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-09 20:50:20

您可以在线程中使用sax解析器。当它检测到fage已满时,它会将其推送到队列中。在主线程中,遍历队列。

票数 0
EN

Stack Overflow用户

发布于 2011-09-09 19:28:14

不要使用SAX,而应使用ElementTree

代码语言:javascript
运行
复制
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元素,而不是几个大的元素。

票数 2
EN

Stack Overflow用户

发布于 2012-09-16 22:05:23

对xml.sax执行此操作的最有效和最简单的方法是使用parser.feed()方法。

示例:

代码语言:javascript
运行
复制
parser = xml.sax.make_parser()
parser.setContentHandler(YourContentHandler)

f = open('terribly_large.xml', 'r')
for line in f.xreadlines():
    parser.feed(line)

这可以确保您同时增量地读取文件,并增量地解析它。

由此产生的内存占用应该是最小的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7360253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档