Scala的XML平等问题

Aar*_*ken 7 xml scala

我在Scala中偶然发现了XML平等的特性:

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
Run Code Online (Sandbox Code Playgroud)

我认为正在发生的是,xml.Text正在创建两个对象,这与一个不同.但是,这不是它在XML规范中的工作原理:)我想知道是否有任何方法来比较相等,以便返回true.

谢谢!

mgi*_*uca 4

表示<a>12</a>具有值为“12”的单个子节点的元素,而<a>{1}2</a>表示具有两个子节点的元素,分别具有值“1”和“2”。

它们在 Scala 中在逻辑上是可区分的:x.childisArrayBuffer(12)y.childis ArrayBuffer(1, 2),因此它们不相等。

XML 规范怎么样?根据我的阅读,这两个 XML 对象并不相等。根据XML 规范,元素的内容由一系列一个或多个事物(DOM 称为“节点”)组成,这些事物可以是CharData。因此,一个元素具有两个相邻的 CharData 子元素是合乎逻辑的,并且这在逻辑上被认为与单个串联的 CharData 子元素不同。

如果您确实想认为它们相等,则应该编写一个规范化过程,该过程采用 XML 对象并连接任何相邻的文本节点,然后执行相等测试。

  • 我认为可能存在 XML 语法无法产生的 DOM 排列?这似乎是其中之一。我认为,即使 Scala 行为有效,组合成单个文本节点似乎也是有效的,而且更有用。 (2认同)
  • @aharon 在 XML 语法中没有办法做到这一点。请注意,我在上面没有提到 DOM(因为这不是我们在这里处理的 API)。根据 XML 规范,它允许多个 CharData 节点相邻。这就解释了为什么 Scala 是正确的,但它并不能得到你想要的东西。我的最后一段确实如此。 (2认同)