Confronto tra stringhe non sempre funziona. L'ordine degli attributi non dovrebbe avere importanza considerando due nodi equivalenti. Tuttavia, se esegui il confronto delle stringhe, l'ordine ovviamente conta.
non sono sicuro se si tratta di un problema o di una funzione, ma la mia versione della lxml.etree preserva l'ordine degli attributi se vengono analizzati da un file o una stringa:
>>> 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
Questo potrebbe essere dipendente dalla versione (io uso Python 2.7.3 con lxml.etree 2.3.2 su Ubuntu); Ricordo che non riuscivo a trovare un modo di controllare l'ordine degli attributi di un anno fa o giù di lì, quando ho voluto (per motivi di leggibilità).
Come ho bisogno di confrontare i file XML che sono stati prodotti da diversi serializzatori, non vedo altro modo di confrontare ricorsivamente tag, testo, attributi e figli di ogni nodo. E ovviamente coda, se c'è qualcosa di interessante lì.
Confronto di lxml e xml.etree.ElementTree
La verità è che può essere a carico di attuazione. Apparentemente, lxml usa un dt ordinato o qualcosa del genere, lo standard xml.etree.ElementTree non conserva l'ordine degli attributi: (. Sì, i ritorni a capo mancano Ma è un problema minore.)
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
Un'altra domanda potrebbe essere quello che è considerato whan poco importante il confronto. Ad esempio, alcuni frammenti potrebbero contenere spazi aggiuntivi e non vogliamo preoccuparci. In questo modo, è sempre meglio scrivere alcune funzioni di serializzazione che funzionano esattamente di cui abbiamo bisogno.
Una funzione per confrontare due elementi possono essere trovati in [risposta di Itamar] (http://stackoverflow.com/a/24349916/2371522) qui sotto . – One