0

我有两个包含许多项目的大型 XML 文件(c.100MB)。我想输出它们之间的区别。

每个项目都有一个 ID,我需要检查它是否在两个文件中。如果是,那么我需要比较该项目的各个值以确保它是同一个项目。

SAX 解析器是解决这个问题的最佳方法吗?它是如何使用的?我使用了元素树和 findall,它们适用于较小的文件,但现在我不能适用于大文件。

srcTree = ElementTree()
srcTree.parse(srcFile)

# finds all the items in both files
srcComponents = (srcTree.find('source')).find('items')
srcItems = srcComponents.findall('item')
dstComponents = (dstTree.find('source')).find('items')
dstItems = dstComponents.findall('item')

# parses the source file to find the values of various fields of each
# item and adds the information to the source set
for item in srcItems:
  srcId = item.get('id')
  srcList = [srcId]
  details = item.find('values')
  srcVariables = details.findall('value')
  for var in srcVariables:
    srcList.append((var.get('name'),var.text))
srcList = tuple(srcList)
srcSet.add(srcList)
4

1 回答 1

2

您可以将 elementtree 用作拉式解析器(如 sax)http://effbot.org/zone/element-pull.htm 以及 elementree http://effbot.org/zone/element-iterparse 中的 iterparse 函数。 htm 这两者都允许您处理大文件,而无需将所有内容加载到内存中。

但是 sax 可以工作(我已经用它处理了比 100MB 大得多的数据)但我现在会使用 elementtree 来完成这项工作。

还可以查看基于 lxml 的增量/事件解析(与 etree 兼容)http://lxml.de/tutorial.html#event-driven-parsing

这是一篇关于使用 iterparse 处理文件 > 1GB http://www.ibm.com/developerworks/xml/library/x-hiperfparse/的好文章

于 2012-07-30T11:10:31.783 回答