似乎属性值是类型Seq[Node].
scala> <a b="1"/>.attribute("b")
res11: Option[Seq[scala.xml.Node]] = Some(1)
Run Code Online (Sandbox Code Playgroud)
这意味着您可以将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>
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很时髦.我从未在现实世界中看到XML作为属性值.为什么允许?为什么属性值根本不属于类型String?
来自Burak Emir 的scala.xml“草案”一书:
开始报价
乍一看,属性似乎只能是字符串,而不是其他任何东西。但是,允许在 XML 中出现相同类型的节点(元素节点除外)有两个原因:数据值和实体引用。
<foo name= "süss" life={Atom(42)}>
Run Code Online (Sandbox Code Playgroud)
结束报价
现在我在 2.8.0 中尝试过,但它不能完全编译 - 我需要使用new Atom(42). 但我可以输入这样的内容:
<foo name={List(Text("s"), EntityRef("uuml"), Text("ss"))}/>
Run Code Online (Sandbox Code Playgroud)
这就是利用节点属性的部分原理。是的,这有点时髦。