2011-01-07 118 views
7

看來屬性值的類型是Seq[Node]Scala XML API:爲什麼允許NodeSeq作爲屬性值?

scala> <a b="1"/>.attribute("b")    
res11: Option[Seq[scala.xml.Node]] = Some(1) 

這意味着您可以將XML分配爲屬性值。

scala> <a b={<z><x/></z>}/>.attribute("b")    
res16: Option[Seq[scala.xml.Node]] = Some(<z><x></x></z>) 

scala> <a b={<z><x/></z>}/>.attribute("b").map(_ \ "x") 
res17: Option[scala.xml.NodeSeq] = Some(<x></x>) 

scala> new xml.PrettyPrinter(120, 2).format(<a b={<z><x/></z>}/>) 
res19: String = <a b="<z><x></x></z>"></a> 

這對我來說似乎很怪異。我從來沒有在現實世界中將XML看作屬性值。爲什麼允許?爲什麼屬性值不是String類型?

回答

4

scala.xml "draft" book由布拉克埃米爾:

開始報價

乍一看,似乎屬性應該只能是字符串,沒有別的。但是,有兩個原因允許出現在XML中的相同類型的節點(元素節點除外):數據值和實體引用。

<foo name= "s&uuml;ss" life={Atom(42)}> 

最終報價

現在,我已經試過了在2.8.0,它並不完全編譯 - 我需要使用new Atom(42)。但我可以鍵入如下內容:

<foo name={List(Text("s"), EntityRef("uuml"), Text("ss"))}/> 

所以這是利用節點屬性的基本原理的一部分。是的,這有點時髦。

相關問題