我一直在使用一些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
除了属性顺序之外,我有两个节点(技术上它们是Elems)看起来是相同的。但是当我尝试提取“Attr”属性的值时,我得到了不同的结果
scala> val attr1 = (test1 \ "@Attr").headOption
attr1: Option[scala.xml.Node] = None
scala> val attr2 = (test2 \ "@Attr").headOption
attr2: Option[scala.xml.Node] = Some()
可替换地:
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()
知道这些差异来自哪里?什么是正确的行为?如果我想要可靠地区分一个简单缺失的属性和一个存在但属于空的属性,我是否基本上已经使用其他东西来解析了?
答案 0 :(得分:3)
当你打电话
时会发生魔术scala.xml.XML.loadFile("test1.xml")
SaxParser空属性解析(test2)导致scala.xml.UnprefixedAttribute的值为scala.collection.immutable.List,其中包含带有属性数据的单个元素scala.xml.Text:String =“”
创建的内联(test1)的Xml具有空属性,如scala.xml.UnprefixedAttribute,其值为scala.collection.immutable.Nil
这些属性是相同的,因为比较有趣。它通过org.scala.Metadata #asAttrMap:
比较属性 def asAttrMap: Map[String, String] =
iterator map (x => (x.prefixedKey, x.value.text)) toMap
如您所见,Nil和List(文本(“”))具有相同的x.value.text值,等于“”
如果您有更多问题,我很乐意回答