Я думаю, что проблема заключается в xml.MetaData
или его подклассе xml.Attribute
. При сравнении двух Elem
s проверяется равенство префикса xml, метки, атрибутов и дочерних элементов Node
.
Теперь у xml.MetaData
есть странная реализация, она содержит себя и в то же время связанный список атрибутов. Это означает, что, например:
scala >val elem = <e x="a" y="b"></e>
elem: scala.xml.Elem = <e y="b" x="a"></e>
scala> elem.attributes
res50: scala.xml.MetaData = y="b" x="a"
scala> elem.attributes.toSet
res51: Set[scala.xml.MetaData] = Set( y="b" x="a", x="a")
например. он генерирует список сам с удаленным атрибутом head.
Проверка на равенство в MetaData
выглядит следующим образом
this.toSet == other.toSet
, который работает нормально, но переопределяется в классе Attribute
. (Мы не можем видеть это в REPL, но наш elem.attributes
на самом деле Attribute
.) Там код только делает это
(this.pre == other.pre) && (this.key == other.key) && (this.value sameElements other.value)
Что было бы хорошо, если бы список атрибутов был преобразован в Set
ранее, но это не так, и только первый элемент в списке атрибутов проверяется на равенство. И, таким образом, если элемент head во внутреннем связанном списке атрибутов окажется одним и тем же элементом в течение двух xml.Elem
s, они будут равны.