Scala中空字符串XML属性的正确行为是什么

Scala中空字符串XML属性的正确行为是什么,xml,scala,Xml,Scala,我一直在使用一些XML,我注意到当scala.XML.Node遇到一个值为空字符串的属性时,它会出现两种不同的行为。例如,使用Scala 2.10.3: scala> val test1 = <Object Name="Test" Attr=""/> test1: scala.xml.Elem = <Object Name="Test" Attr=""/> scala> scala.xml.XML.save("test1.xml", test1) scal

我一直在使用一些XML,我注意到当scala.XML.Node遇到一个值为空字符串的属性时,它会出现两种不同的行为。例如,使用Scala 2.10.3:

scala> val test1 = <Object Name="Test" Attr=""/>
test1: scala.xml.Elem = <Object Name="Test" Attr=""/>

scala> scala.xml.XML.save("test1.xml", test1)

scala> val test2 = scala.xml.XML.loadFile("test1.xml")
test2: scala.xml.Elem = <Object Attr="" Name="Test"/>

scala> test1 == test2
res1: Boolean = true
或者:

scala> val attrs1 = test1.attributes
attrs1: scala.xml.MetaData =  Name="Test" Attr=""

scala> val attrs2 = test2.attributes
attrs2: scala.xml.MetaData =  Attr="" Name="Test"

scala> attrs1 == attrs2
res5: Boolean = true

scala> val attr1 = attrs1.get("Attr")
attr1: Option[Seq[scala.xml.Node]] = Some(List())

scala> val attr2 = attrs2.get("Attr")
attr2: Option[Seq[scala.xml.Node]] = Some()

你知道这些差异是从哪里来的吗?正确的行为是什么?如果我想可靠地区分一个完全缺失的属性和一个存在但为空的属性,那么我基本上就只能使用其他东西来进行解析了吗?

当你调用

scala.xml.XML.loadFile("test1.xml")
SaxParser空属性解析(test2)生成值为scala.collection.immutable.List的scala.xml.unfixedAttribute,其中包含单个元素scala.xml.Text,属性数据为:String=“”

内联创建的Xml(test1)具有值为scala.collection.immutable.Nil的空属性scala.Xml.unfixedAttribute

由于比较有趣,这些属性是相等的。它通过org.scala.Metadata#asAttrMap比较属性:

  def asAttrMap: Map[String, String] =
    iterator map (x => (x.prefixedKey, x.value.text)) toMap
如您所见,Nil和List(Text(“”)具有相同的x.value.Text值,该值等于“”

如果你有更多的问题,我很乐意回答

  def asAttrMap: Map[String, String] =
    iterator map (x => (x.prefixedKey, x.value.text)) toMap