这是scala.xml.Elem中的错误吗?

时间:2011-01-04 21:03:44

标签: xml scala

将Set [String]映射到Set [Elem]的属性可以正常使用一个属性,但是当共享其中一个属性时,似乎失败了多个属性:

scala> val s1=Set("A","B","C")
s1: scala.collection.immutable.Set[java.lang.String] = Set(A, B, C)

scala> s1.map((a:String)=>{<X w={a}></X>})
res3: scala.collection.immutable.Set[scala.xml.Elem] = Set(<X w="A"></X>, <X w="B"></X>, <X w="C"></X>)

scala> s1.map((a:String)=>{<X w={a} k="SSS"></X>})
res4: scala.collection.immutable.Set[scala.xml.Elem] = Set(<X k="SSS" w="A"></X>)

B&amp; C 1

或者我对Elems的平等理解是错误的吗?

2 个答案:

答案 0 :(得分:2)

这似乎是一个错误,虽然是一个非常奇怪的错误。我猜这是Set而不是Elem的错误,但在这一点上我不能说任何权威。

答案 1 :(得分:1)

我认为问题在于xml.MetaData或其子类xml.Attribute。比较两个Elem时,会检查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")

E.g。它会删除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的相同元素,那么它们将是相等的。