Dizeleri karşılaştırma her zaman çalışmaz. Niteliklerin sırası, iki düğüm eşdeğerini dikkate almak için önemli olmamalıdır. Ancak, dize karşılaştırması yaparsanız, sipariş açıkça önemlidir.
>>> 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
Bu:
Bunun bir sorun ya da bir özelliktir, ancak bir dosya veya bir dizesinden ayrıştırılır eğer lxml.etree benim sürümü niteliklerini sırasını korur olmadığından emin değilim sürüm bağımlı olabilir (Ubuntu üzerinde lxml.etree 2.3.2 ile Python 2.7.3 kullanıyorum); Anladığım kadarıyla, bir yıl önce özniteliklerin sırasını kontrol etmenin bir yolunu bulamadım (okunabilirlik nedenleriyle).
Farklı serileştiriciler tarafından üretilen XML dosyalarını karşılaştırmak gerektiğinden, her düğümün etiketini, metnini, niteliklerini ve çocuklarını yinelemeli olarak karşılaştırmaktan başka bir yol görmüyorum. Ve elbette kuyruğun, eğer ilginç bir şey varsa. LXML ve xml.etree.ElementTree
gerçeği ait
Karşılaştırılması o uygulama bağımlı olabileceğidir. Görünüşe göre, lxml, standart xml.etree gibi sipariş edilen bir dict veya bir şey kullanır.Elementtree niteliklerin düzeni korumak değildir: (. Evet, yeni satırlar eksik Ama küçük bir sorundur.)
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
başka soru karşılaştıran önemsiz whan kabul edilen olabilir. Örneğin, bazı fragmanlar fazladan boşluk içerebilir ve umursamamak istemeyiz. Bu şekilde, tam olarak ihtiyacımız olan bazı serileştirme fonksiyonları yazmak her zaman daha iyidir.
iki Element karşılaştırmak için bir fonksiyon bulunabilir [Itamar cevabı] (http://stackoverflow.com/a/24349916/2371522) altına . – One