我有一些幾乎相同的XML,我試圖比較,並且發現了這個:Compare XML snippets?這指出了這一點:https://bitbucket.org/ianb/formencode/src/tip/formencode/doctest_xml_compare.py#cl-70我有一種測試兩個節點的方法。Python - 抽象遞歸到所有的第n級遞歸(lxml)
下一步是從基於節點的測試中取出輸出,並且如果步入所有的孩子並重複測試。
我已經寫了沃克的很長的路,可以讓我通過儘可能多的孩子一步,因爲我想要寫代碼:
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,其不是很優雅。我thnk我需要寫一個發電機行走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對象,我可以運行。我懷疑我已經把這個功能變成了一個類,並且沒有給出/得到正確的東西。
我想要做的是找到一個錯誤比較的來源,並打印兩個違規的數據元素,並知道他們住在哪裏(或從兩個XML中丟失)。
遞歸是方式 – BlackBear
我不確定這是否會有所幫助,但在Python 3.3中,例如,可以使用'yield from'來實現類似決策樹的東西(這聽起來像你的東西做)在配方「實施迭代協議」:http://chimera.labs.oreilly.com/books/1230000000393/ch04.html#_discussion_59 – erewok
@erewok謝謝,我在2.7不幸。 –