【问题标题】:Python comparison of XML filesXML文件的Python比较
【发布时间】:2012-07-30 10:50:12
【问题描述】:

我有两个包含许多项目的大型 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)

【问题讨论】:

  • 向我们展示您编写的失败代码
  • 它将所有内容加载到内存中,因此它不适用于这些文件。我使用元素树来获取每个 xml 文件中的数据树。我在树上使用 find 将所有项目放入列表中。然后我遍历这些项目以获取每个项目的值并将信息存储在一组元组中:[(id,val,val),(id,val,val)]。我对这两个文件都这样做了。找到集合的差异,然后将结果存储在一个文件中。

标签: python xml comparison saxparser


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 2020-02-19
    相关资源
    最近更新 更多