如何在没有文字元素名称的Scala中创建XML根节点?

Isa*_*tes 7 xml scala scala-2.8

我想创建一个这样的文档:

<root/>
Run Code Online (Sandbox Code Playgroud)

我可以以编程方式添加子项.从理论上讲,它看起来像这样:

val root_node_name = "root"
val doc = <{root_node_name}/>
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用:

error: not found: value <
Run Code Online (Sandbox Code Playgroud)

所以,我试过的是这样的:

val root_node_name = "root"
val doc = new scala.xml.Elem(null, root_node_name, null, scala.xml.TopScope, null)  
Run Code Online (Sandbox Code Playgroud)

编译,但在运行时我得到这个空指针异常:

java.lang.NullPointerException
at scala.xml.Utility$.toXML(Utility.scala:201)
at scala.xml.Utility$$anonfun$sequenceToXML$2.apply(Utility.scala:235)
at scala.xml.Utility$$anonfun$sequenceToXML$2.apply(Utility.scala:235)
at scala.Iterator$class.foreach(Iterator.scala:414)
at scala.runtime.BoxedArray$AnyIterator.foreach(BoxedArray.scala:45)
at scala.Iterable$class.foreach(Iterable...
Run Code Online (Sandbox Code Playgroud)

我正在使用Scala 2.8.有关如何解决此问题的任何示例?谢谢.

Rex*_*err 7

你应该传递属性(scala.xml.Null)的空列表,如果你不想要任何子节点,你甚至不应该包含最后的参数.你想要一个空的孩子列表,而不是一个孩子null.所以:

scala> val root_node_name = "root"
root_node_name: java.lang.String = root

scala> val doc = new scala.xml.Elem(null, root_node_name, scala.xml.Null , scala.xml.TopScope)
doc: scala.xml.Elem = <root></root>
Run Code Online (Sandbox Code Playgroud)


huy*_*hjl 5

在2.8上你可以这样做:

scala> val r = <root/>
r: scala.xml.Elem = <root></root>

scala> r.copy(label="bar")
res0: scala.xml.Elem = <bar></bar>
Run Code Online (Sandbox Code Playgroud)

因此,如果您的初始文档是<root/>,那么只需使用文字.如果您需要能够在运行时设置标签,则可以定义如下方法:

def newRoot(label:String) = {val r = <root/>; r.copy(label=label) }
Run Code Online (Sandbox Code Playgroud)