2013-12-10 33 views
3

我一直在使用一些XML,並且我注意到當scala.xml.Node遇到一個具有值的屬性時,我會看到兩個不同的行爲是一個空字符串。作爲一個例子,使用Scala的2.10.3:什麼是Scala中空字符串XML屬性的正確行爲

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() 

任何想法,這些差異是哪裏來的?什麼是正確的行爲?如果我想要可靠地區分僅存在缺失的屬性和存在但爲空的屬性,我基本上是否會使用其他方法來解析數據?

回答

3

奇蹟發生了,當你調用

scala.xml.XML.loadFile("test1.xml") 

SAXParser的空屬性解析在scala.xml.UnprefixedAttribute(TEST2)的結果與財產數據單元素scala.xml.Text值scala.collection.immutable.List :字符串= 「」

的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 

正如你看到的,零和列表(文本( 「」))具有x.value.text相同的值,等於 「」

如果您有更多的問題,我會很樂意回答

相關問題