文字列の比較が常に機能するとは限りません。属性の順序は、2つのノードを同等と見なしても問題ありません。しかし、文字列の比較を行う場合、順序は明らかに重要です。
私はそれが問題や機能であるかどうかわからないんだけど、彼らは、ファイルや文字列から解析された場合lxml.etreeの私のバージョンは、属性の順序を保持する:
>>> from lxml import etree
>>> h1 = etree.XML('<hat color="blue" price="39.90"/>')
>>> h2 = etree.XML('<hat price="39.90" color="blue"/>')
>>> etree.tostring(h1) == etree.tostring(h2)
False
このバージョンに依存するかもしれません(私はUbuntuでlxml.etree 2.3.2でPython 2.7.3を使用しています)。 1年前に属性の順序を制御する方法が見つからないことを覚えています(可読性の理由から)。
異なるシリアライザによって生成されたXMLファイルを比較する必要があるため、タグ、テキスト、属性、およびすべてのノードの子を再帰的に比較する以外の方法はありません。もちろん、そこに興味深いものがあれば、尾ももちろんです。
lxmlの比較とxml.etree.ElementTree
真実は、それは実装依存する可能性があるということです。どうやら、lxmlは、標準のxml.etreeというような、命令付きのdictなどを使用しています。ElementTreeのは、属性の順序は保持されません:
Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from lxml import etree
>>> h1 = etree.XML('<hat color="blue" price="39.90"/>')
>>> h2 = etree.XML('<hat price="39.90" color="blue"/>')
>>> etree.tostring(h1) == etree.tostring(h2)
False
>>> etree.tostring(h1)
'<hat color="blue" price="39.90"/>'
>>> etree.tostring(h2)
'<hat price="39.90" color="blue"/>'
>>> etree.dump(h1)
<hat color="blue" price="39.90"/>>>> etree.dump(h2)
<hat price="39.90" color="blue"/>>>>
を(はい、改行が不足しています。しかし、それはマイナーな問題である。。)
>>> import xml.etree.ElementTree as ET
>>> h1 = ET.XML('<hat color="blue" price="39.90"/>')
>>> h1
<Element 'hat' at 0x2858978>
>>> h2 = ET.XML('<hat price="39.90" color="blue"/>')
>>> ET.dump(h1)
<hat color="blue" price="39.90" />
>>> ET.dump(h2)
<hat color="blue" price="39.90" />
>>> ET.tostring(h1) == ET.tostring(h2)
True
>>> ET.dump(h1) == ET.dump(h2)
<hat color="blue" price="39.90" />
<hat color="blue" price="39.90" />
True
もう一つの問題は重要でないwhan比較するとみなされるものであってもよいです。たとえば、一部のフラグメントに余分なスペースが含まれていて、気にしたくない場合があります。このようにして、私たちが必要とする正確に機能するシリアライズ関数を書く方が良いでしょう。
2つの要素を比較する機能は、以下の[Itamarの答え](http://stackoverflow.com/a/24349916/2371522)で見つけることができます。 – One