Проблема равенства XML со Scala - PullRequest
7 голосов
/ 29 марта 2011

Я столкнулся с особенностью равенства XML в Scala:

scala> val x = <a>12</a>
x: scala.xml.Elem = <a>12</a>

scala> val y = <a>{1}2</a>
y: scala.xml.Elem = <a>12</a>

scala> x == y
res0: Boolean = false

Я думаю, что происходит то, что создаются два xml.Text объекта, и это отличается от одного. Тем не менее, это не так, как это работает в спецификации XML :), и мне интересно, есть ли способ сравнить равенство так, чтобы это вернуло true.

Спасибо!

1 Ответ

4 голосов
/ 29 марта 2011

<a>12</a> представляет элемент с одним дочерним узлом со значением «12», тогда как <a>{1}2</a> представляет элемент с двумя дочерними узлами со значениями «1» и «2» соответственно.

Они логически различимы в Scala: x.child - это ArrayBuffer(12), тогда как y.child - это ArrayBuffer(1, 2), и поэтому они неравны.

А как насчет спецификации XML? Насколько я понимаю, эти два объекта XML не равны . Согласно спецификации XML , содержимое элемента состоит из последовательности одной или нескольких вещей (которые DOM называет «узлами»), и эти вещи могут быть CharData . Поэтому для элемента логично иметь два смежных дочерних элемента CharData, и это считается логически отличным от одного дочернего сцепленного CharData.

Если вы действительно хотите считать их равными, вы должны написать проход нормализации, который берет объект XML и объединяет любые смежные текстовые узлы, а затем выполняет тест на равенство.

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