4

我尝试比较一些几乎相同的 XML,并发现了这一点:比较 XML 片段?这指出了这一点:https ://bitbucket.org/ianb/formencode/src/tip/formencode/doctest_xml_compare.py#cl-70我有一种测试两个节点的方法。

下一步是从基于节点的测试中获取输出,如果是False,则进入所有子节点,并重复测试。

我已经写了一个很长的路,它让我可以遍历尽可能多的孩子,我想为以下代码编写代码:

 if xml.xml_compare(a.root, b.root) == False:
    for i, node in enumerate(a.root):
        if xml.xml_compare(a.root[i], b.root[i]) == False:
            for j, node in enumerate(a.root[i]):
                if xml.xml_compare(a.root[i][j], b.root[i][j]) == False:
                    for k, node in enumerate(a.root[i][j]):
                        ....
                            if xml.xml_compare(a.root[i][j][k][l][m][n], b.root[i][j][k][l][m][n]) == False:

这显然不适合任意大小的 XML,而且它不是很优雅。我想我需要编写一个生成器来遍历被测 XML - 我看到 itertool 是这样做的一种方式:

class XML_Tools(object):
    ....
    def iterparent(self, xml_object):
    """ 
    returns the parent and children of a node
    """
    for parent in xml_object.getiterator():
        for child in parent:
            yield self.parent, self.child

    main():
    a = ET.parse(open(file_a, "r")
    b = ET.parse(open(file_b, "r")
    xml.iterparent(a.root)
    for xml.parent, xml.child in xml.iterparent(a.root):
        print xml.parent, xml.child

但是我找不到一种方法来获取我可以运行的工作 xml.parent 或 xml.child 对象。我怀疑我已经搞砸了将函数移动到一个类中,并且没有给出/得到正确的东西。

我想要做的是找到 False 比较的来源,并打印两个有问题的数据元素,并知道它们在两段 XML 中的位置(或缺失)。

4

1 回答 1

3

我建议使用递归算法,该算法将要比较的 2 个项目的列表和通行证编号作为参数。您需要一本字典,指定每次传递时要提供的列表。您还可以编写一个算法来创建 n 个元素的字典,希望这会有所帮助。如果这更有帮助,我可以尝试提供示例代码。

编辑:

n=3 ##Depth of tree

d={'0':['a.root', 'b.root', 0]}

for i in range(n):
    d[str(i+1)]=[d[str(i)][0]+'['+chr(105+i)+']', #since ord('i')=105, start
                 d[str(i)][1]+'['+chr(105+i)+']', # at i, j, k, etc
                 i+1                              #passNo
                ]

print(d)

def compare(points=d['0'], passNo=0):
    if xml.xml_compare(eval(points[0]), eval(points[1])) == False:
        exec('for'+str(chr(points[2]+105))+'in enumerate('+str(points[0])+\
             '): compare('+str(d[str(passNo+1)][0])+', '+str(d[str(passNo+1)][1])+')')

compare()

我为代码的混乱深表歉意,但我认为这会做你想做的事。但是,我无法在不知道您如何导入 xml 模块/内容或您正在使用的 xml 对象的情况下对其进行测试。希望这可以帮助。

于 2013-09-05T17:00:02.030 回答