2

そのため、2 つの XML を比較して同じかどうか (同じデータが含まれているかどうか) を確認するために、「重複チェッカー」を作成する必要があります。これらは同じクラスに由来し、XSD 構造から生成されるため、内部の要素の順序は同じになる可能性が高くなります。

重複チェックを行う最善の方法は、2 つの辞書 (dictLeft、dictRight) を設定し、xpath#value をキーとして保存し、その回数を保存することです。このようなもの:

左:

{ 'my/path/to/name#greg': 1, 'my/path/to/name#john': 2, 'my/path/to/car#toyota': 1}

{ 'my/path/to/name#greg': 1, 'my/path/to/name#bill': 1, 'my/path/to/car#toyota': 1}

これら 2 つの辞書を比較すると、これら 2 つの XML が同じかどうかをかなり正確に知ることができます (誤った結果が得られる可能性はまれですが、それはごくわずかです)。

他の誰かがより良いアイデアを持っていますか? 私が知らないElementTreeの関数でしょうか?

編集:よりよく説明するには:

<root><person><name>Bob</name><surname>marley</surname></root>

<root><person><surname>marley</surname><name>Bob</name></root>

同じとみなされます。属性を無視しています。アイデアは、パフォーマンスをあまり妨げずに、コードをできるだけ単純に保つことです。

4

4 に答える 4

1

OK、だから私は決定を下さなければならず、これに行きました:

foreach path in xpathlist
  find entries for path for both xml1 and xml2
  foreach entry in xmlentries1
    dict1[path#entry.value]++
  foreach entry in xmlentries2
    dict2[path#entry.value]++

  if dict1 and dict2 are not equal
    return false
return true

これが理にかなっていることを願っています。これにより、特定/すべての xpath をテストできます。誰かがより良いアルゴリズムを持っている場合、私はすべて耳にします:)

于 2011-03-16T09:30:09.517 に答える
0

あなたの例から、 iterparse を使用して collections.Counter を使用して、各タグの外観とその属性をカウンターのキーとしてカウントできるように思われます。例:

from xml.etree import cElementTree as ElementTree
from collections import Counter

your_xml = get_xml()
count = Counter()
parser = ElementTree.iterparse(your_xml)
for event, element in parser:
    #joining string as key for ease of debugging, strictly speaking,
    #one could use a tuple and save the str() on the attrib dict
    key = "".join((element.tag, str(element.attrib), element.text))
    count[element.tag] += 1

または、通常の辞書を数えて、2 つの辞書の等価性を比較するだけです (概念的には私には単純に思えます)。

于 2011-03-14T15:56:57.750 に答える
0

この問題は、「同じ」の意味を定義することから始まります。

たとえば、XML 要素の等価性の簡単な定義は、次の場合に 2 つの XML 要素が等しいということです。

  • それらは同じ名前空間にあり、
  • それらは同じタグ名を持ち、
  • 同じ属性セットと同じ値を持ち、
  • コメントと処理命令を除く子ノードのそれぞれのリスト、および空白のみのテキストノードには、同じ値が同じ順序で含まれています。

この些細な定義が十分でない理由はさまざまです。

  • 知っている名前空間にない要素を無視したい場合があります。つまり、他のアプリケーションがデータを XML に保存しているという理由だけで、アプリケーションの等価性テストが失敗することを望まない場合があります。
  • 子要素の順序付けは重要ではないか、(さらに悪いことに) 一部の要素では重要であり、他の要素では重要ではない可能性があります。
  • コメント、処理命令、および空白のみのテキスト ノードが重要な場合があります
  • それらを比較する前に、テキストノード内の空白を正規化する必要がある場合があります ( normalize-space()XSLT の関数を参照)。

等価性を定義したら、それをテストするメソッドの実装は比較的簡単です。ただし、最初に平等を定義する必要があります。

于 2011-03-14T19:29:28.277 に答える
0

2 つの XML が同じコードから生成され、同じ値が (同じ順序で) 含まれている場合は、単純に XML データの文字列比較を行うことができます。

それが機能する場合、それはおそらく可能な単純な解決策ですが、それが機能しない理由があるかもしれません.

于 2011-03-14T16:21:52.983 に答える