我一直在处理一些 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
我有两个节点(从技术上讲,它们是元素),除了属性顺序外,它们看起来完全相同。但是当我尝试提取“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()
知道这些差异从何而来吗?什么是正确的行为?如果我想可靠地区分一个完全缺失的属性和一个存在但为空的属性,我是否基本上已经放弃使用其他东西来进行解析?
最佳答案
神奇的事情发生在你打电话的时候
scala.xml.XML.loadFile("test1.xml")
SaxParser 空属性解析(test2)导致 scala.xml.UnprefixedAttribute 具有值 scala.collection.immutable.List 具有单个元素 scala.xml.Text 具有属性数据:String = ""
内联创建的 Xml (test1) 具有空属性,如 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(Text("")) 具有相同的 x.value.text 值,等于 ""
如果你有更多问题,我很乐意回答
关于xml - Scala 中空字符串 XML 属性的正确行为是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20503730/