2009-09-15 7 views
11

Najwyraźniej muszę (a) przekonwertować oba łańcuchy na canonical XML lub (b) porównać ich parsowania. Poniższe czynności nie działają, ponieważ obiekt dokumentu, który został zwrócony, nie ma zdefiniowanego sensownego ==.Jak przetestować równość XML w Ruby?

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

ani też zwolenników, ponieważ Nokogiri na to_xml pozostawia pewną wewnętrzną spacje:

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

jest to rozsądne przybliżenie równości (i będzie pracować dla większości przypadków), ale to nie do końca prawda:

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

Używam już Nokogiri, więc wolałbym go trzymać, ale użyję dowolnej biblioteki.

+2

Chciałbym zobaczyć dobrą odpowiedź na to. AFAIK, kanoniczny XML to twoja jedyna alternatywa w tej chwili. – Swanand

+0

możliwy duplikat [diff a ruby ​​string or array] (http://stackoverflow.com/questions/80091/diff-a-ruby-string-or-array) – sawa

Odpowiedz

4

Jeśli szukasz równości strukturalnej i nie interesuje cię kolejność tagów i atrybutów, prawdopodobnie biblioteka xml-simple jest dobrym wyborem.Konwertuje xml na struktury danych ruby ​​(hashe i listy), które można bezpiecznie porównać z operatorem ==.

1

Konwersja ich na ciągi nie będzie bardzo udana. Na przykład, jeśli element ma dwa atrybuty, czy kolejność ma znaczenie? W większości przypadków nie. Czy kolejność dzieci danego węzła? Zależy od tego, co robisz. Ale jeśli odpowiedź na jedno z tych pytań brzmi "nie", to proste porównanie łańcuchów jest w najlepszym przypadku kludem.

W Nokogiri nie ma nic, co mógłby zrobić dla ciebie; będziesz musiał sam ją zbudować. Aaron Patterson discusses some of the issues here:

ile jest dokumentem XML zaniepokojony, nie dwa węzły są zawsze równe. Każdy węzeł w dokumencie jest inny niż . Każdy węzeł ma wiele atrybutów:

  1. Czy nazwa jest taka sama?
  2. Co z atrybutami?
  3. Co powiesz na temat przestrzeni nazw?
  4. A co z liczbą dzieci?
  5. Czy wszystkie dzieci są takie same?
  6. Czy to węzeł nadrzędny to samo?
  7. Co z jego położeniem w stosunku do węzłów siostrzanych?

Pomyśl o dodaniu dwóch węzłów do tego samego dokumentu o numerze . Mogą one nigdy mieć tej samej pozycji w stosunku do węzłów siostrzanych , dlatego dwa węzły w dokumencie nie mogą być "równe".

Możesz można jednak porównać dwa różne dokumenty . Ale musisz odpowiedzieć na te 7 pytań samodzielnie, jako , przechodząc przez dwa drzewa. Wymagania dotyczące identyczności mogą być różne od .

To najlepiej: chodź po drzewach i dokonaj porównań.

+4

Jestem prawie pewny, że canonical XML (http: // www.w3.org/TR/xml-c14n) zajmuje się wszystkimi tymi siedmioma problemami. –

11

Istnieje kilka dobrych bibliotek opartych na Nokogiri do sprawdzania równoważności drzewek XML, w tym equivalent-xml lub nokogiri-diff, które mogą być pomocne.

Preferuję ekwiwalent-xml, ponieważ zapewnia on nieco większą elastyczność (być może kosztem ścisłości?), Umożliwiając porównanie z lub bez względu na kolejność elementów lub białe znaki.

+0

Plus ten odpowiednik-xml zapewnia Matchery RSPEC. –

Powiązane problemy