2009-09-15 16 views
11

Chiaramente ho bisogno di (a) convertire entrambe le stringhe in canonical XML o (b) confrontare i loro alberi di analisi. Quanto segue non funziona perché l'oggetto documento restituito non ha un ragionevole valore definito da ==.Come posso testare l'uguaglianza XML in Ruby?

Nokogiri.XML(doc_a) == Nokogiri.XML(doc_b) 

né quanto segue, perché Nokogiri di to_xml lascia qualche spazio bianco interno:

Nokogiri.XML(doc_a).to_xml == Nokogiri.XML(doc_b).to_xml 

Questa è una ragionevole approssimazione di uguaglianza (e lavorerà per la maggior parte dei casi), ma non è proprio così:

Nokogiri.XML(doc_a).to_xml.squeeze(' ') == Nokogiri.XML(doc_b).to_xml.squeeze(' ') 

Sto già utilizzando Nokogiri, quindi preferirei seguirlo, ma userò qualsiasi libreria funzioni.

+2

Mi piacerebbe vedere una buona risposta a questo. AFAIK, XML canonico è la tua unica alternativa in questo momento. – Swanand

+0

possibile duplicato di [diff a ruby ​​string o array] (http://stackoverflow.com/questions/80091/diff-a-ruby-string-or-ray) – sawa

risposta

4

Se stai cercando l'uguaglianza strutturale e non ti interessa l'ordine di tag e attributi, probabilmente la libreria xml-simple è una buona scelta.Converte l'xml in strutture di dati di ruby ​​(hash e liste) che possono essere confrontate in modo sicuro con l'operatore ==.

1

La conversione in stringhe non avrà molto successo. Ad esempio, se un elemento ha due attributi, l'ordine conta davvero? Nella maggior parte dei casi, no. L'ordine dei bambini di un dato nodo? Dipende da cosa stai facendo. Ma se la risposta a una di quelle domande è "no", allora un semplice confronto tra stringhe è un kludge nel migliore dei casi.

Non c'è niente in Nokogiri per farlo per voi; dovrai costruirlo da solo. Aaron Patterson discusses some of the issues here:

Per quanto riguarda il documento XML è preoccupato, non ci sono due nodi sono sempre uguali. Ogni nodo in un documento è diverso da . Ogni nodo ha molti attributi da confrontare:

  1. Il nome è lo stesso?
  2. E gli attributi?
  3. E il namespace?
  4. E il numero di bambini?
  5. Tutti i bambini sono uguali?
  6. È il nodo padre lo stesso?
  7. E la sua posizione rispetto ai nodi fratelli?

Pensate all'aggiunta di due nodi allo stesso documento . Possono mai avere la stessa posizione relativa ai fratelli nodi, quindi due nodi in un documento non possono essere "uguali".

È possibile tuttavia confrontare due documenti diversi. Ma devi rispondere a queste 7 domande come mentre cammini i due alberi. I requisiti per la stessa identità possono differire da da altri.

Questa è la soluzione migliore: camminare sugli alberi e fare questi confronti.

+4

Sono piuttosto sicuro di XML canonico (http: // www.w3.org/TR/xml-c14n) si prende cura di tutti e sette questi problemi. –

11

In realtà ci sono un paio di buone librerie basate su Nokogiri per verificare l'equivalenza degli alberi XML, incluso equivalent-xml o nokogiri-diff, che può essere utile.

Preferisco equivalente-xml perché fornisce un po 'più di flessibilità (forse a costo di rigore?), Consentendo di confrontare con o senza riguardo per l'ordine degli elementi o spazi bianchi.

+0

Inoltre, l'equivalente-xml fornisce i correttori RSpec. –