2013-02-15 34 views
5

当声明Scala中的一个节点序列作为文字你得到scala.xml.NodeBuffer,其是可变的(它延伸ArrayBuffer[scala.xml.Node]这又延伸Seq[scala.xml.Node]):为什么XML文字在Scala中产生可变对象?

scala> val xml = <a /><b /> 
xml: scala.xml.NodeBuffer = ArrayBuffer(<a></a>, <b></b>) 

scala> xml += <c /> 
res46: xml.type = ArrayBuffer(<a></a>, <b></b>, <c></c>) 

scala> xml 
res47: scala.xml.NodeBuffer = ArrayBuffer(<a></a>, <b></b>, <c></c>) 

这违背使用不可改变的对象和功能的编程的Scala的理念。为什么集合默认是不可变的,但是XML文字(这是第一类公民)不是在这种情况下?

但是,是否可以使用XML文字安全地定义不可变节点序列?

回答

4

似乎不可变的XML文字需要单个根节点(就像XML一样)。 scala.xml.Group允许您使用<xml:group />的“奶嘴”根节点执行此操作。

这在API文档中雄辩地描述为“在一个节点中将XML节点分组以输出”。

scala> val xml = <xml:group><a /><b /></xml:group> 
xml: scala.xml.Group = <a></a><b></b> 

当你与其他XML结合该片段,该群节点消失:

scala> <foo>{xml}</foo> 
res1: scala.xml.Elem = <foo><a></a><b></b></foo> 
相关问题