Как проверить равенство XML в Ruby? - PullRequest
12 голосов
/ 16 сентября 2009

Ясно, что мне нужно (а) преобразовать обе строки в канонический XML или (б) сравнить их синтаксические деревья. Следующее не работает, потому что возвращенный объект документа не определен разумным ==.

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

Так же как и следующее, потому что to_xml Нокогири оставляет некоторое внутреннее пространство:

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

Это разумное приближение равенства (и оно будет работать в большинстве случаев), но оно не совсем верно:

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

Я уже использую Nokogiri, поэтому я бы предпочел придерживаться его, но я буду использовать любую библиотеку, которая работает.

Ответы [ 3 ]

12 голосов
/ 17 мая 2011

На самом деле есть пара хороших библиотек на основе Nokogiri для проверки эквивалентности деревьев XML, включая эквивалент-xml или nokogiri-diff , которые могут быть полезны.

Я предпочитаю эквивалент-xml, потому что он обеспечивает немного большую гибкость (возможно, ценой строгости?), Позволяя сравнивать с или без учета порядка элементов или пробелов.

4 голосов
/ 17 мая 2011

Если вы ищете структурное равенство и не заботитесь о порядке тегов и атрибутов, вероятно, библиотека xml-simple является хорошим выбором. Он преобразует xml в структуры данных ruby ​​(хэши и списки), которые можно безопасно сравнить с оператором ==.

1 голос
/ 16 сентября 2009

Преобразование их в строки не будет очень успешным. Например, если элемент имеет два атрибута, действительно ли порядок имеет значение? В большинстве случаев нет. Имеет ли порядок дочерний узел данного узла? Зависит от того, что вы делаете. Но если ответом на один из этих вопросов является «нет», то простое сравнение строк в лучшем случае является препятствием.

В Нокогири нет ничего, что могло бы сделать это для вас; Вы должны будете построить это самостоятельно. Аарон Паттерсон обсуждает некоторые вопросы здесь :

Насколько XML-документ обеспокоены тем, что никогда не бывает двух узлов равны. Каждый узел в документе разные. Каждый узел имеет много атрибуты для сравнения:

  1. Имя такое же?
  2. Как насчет атрибутов?
  3. Как насчет пространства имен?
  4. А как насчет количества детей?
  5. Все ли дети одинаковы?
  6. Это родительский узел такой же?
  7. Как насчет его положения относительно узлов-братьев?

Подумайте о добавлении двух узлов к тот же документ. Они могут никогда иметь та же самая позиция относительно родного брата узлы, поэтому два узла в документ не может быть «равным».

Вы можете однако сравните два разные документы. Но вам нужно сами ответьте на эти 7 вопросов как ты идешь по двум деревьям. Ваш Требования к одинаковости могут отличаться от других.

Это ваш лучший выбор: гуляйте по деревьям и делайте эти сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...