在Python中高效比较两个XML文件

5

我希望在Python脚本中找到一种高效的方法来比较两个XML文件并处理差异。场景是我有两个类似以下的XML文件:

<?xml version="1.0" encoding="UTF-8"?> 
<garage> 
    <car> 
        <color>red</color> 
        <size>big</size> 
        <price>10000</price>
    </car> 
    <car> 
        <color>blue</color> 
        <size>big</size> 
        <price>10000</price>

    <!-- [...] -->

    <car> 
        <color>red</color> 
        <size>big</size> 
        <price>11000</price>
    </car> 
    </car> 
</garage>

这些XML文件包含成千上万个小对象。这些文件本身大小约为5MB。棘手的是,只有两个文件中极少数条目不同,并且我只需要处理不同的信息。换句话说:我需要高效地找出哪些条目发生了变化或已添加。不幸的是,XML文件也包含一些我完全不关心的可选条目。
我考虑了以下解决方案:
  1. 将两个文件解析为DOM树并在循环中对它们进行比较
  2. 将两个文件解析为集合并使用诸如set.difference之类的运算符
  3. 尝试将一些处理交给Linux工具,例如grep和diff
有没有人在这里有这样的方法的性能经验,可以指导我走向哪里?

通过使用 Google 并尝试 https://pypi.python.org/pypi/xmldiff - user2665694
1
@user2799617:那个项目非常过时。但是如果你已经让它工作了,也许你想发表一个回答来展示给我们看? - Martijn Pieters
我会首先尝试第三个选项。 - Ashalynd
1
我认为,首先解析XML并将其“规范化”为一系列文本行,每行描述一辆汽车,格式使得相同的汽车始终产生相同的字符串。因此,删除您不关心的内容,并按照每辆汽车的固定顺序呈现与汽车相关的元素。然后使用difflib获取差异。 - Steve Jessop
它部分取决于您想要什么输出。史蒂夫的建议无疑是最简单的。 - Lennart Regebro
1个回答

1
创建一个缓存的中间格式,只包含您关心比较的内容。在比较两个文件A.xmlB.xml时,比较它们的A.cachedB.cached,如果缺失则生成并在文件更改时删除(或根据时间戳等重新生成)。生成成本将分摊到多个比较中,您不会迭代不必要的条目。
".cached"的格式实际上取决于您关心的内容以及需要多少信息/上下文。它甚至可以具有二进制表示。

感谢您提供的所有建议。在阅读了大量资料后,我得出结论,我将尝试构建一个样式表,将XML转换为包含所有重要值的平面文本文件。我希望XML周围的工具实现比我能想到的任何实现都更有效率。一旦完成,我会告诉您它是否奏效... - Norbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接