Я надеюсь создавать документ как это:
<root/>
То, что я могу добавить детей к программно. Теоретически, это было бы похоже на это:
val root_node_name = "root"
val doc = <{root_node_name}/>
Но это, кажется, не работает:
error: not found: value <
Так, что я попробовал, вместо этого было это:
val root_node_name = "root"
val doc = new scala.xml.Elem(null, root_node_name, null, scala.xml.TopScope, null)
Это компилирует, но во времени выполнения я получаю это исключение нулевого указателя:
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...
Я использую Scala 2.8. Какие-либо примеры того, как осуществить это?Спасибо.
Вы должны передавать пустой список для атрибутов (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>
В версии 2.8 вы можете сделать следующее:
scala> val r = <root/>
r: scala.xml.Elem = <root></root>
scala> r.copy(label="bar")
res0: scala.xml.Elem = <bar></bar>
Итак, если ваш исходный документ имеет вид
, то просто используйте литерал. Если вам нужно иметь возможность устанавливать метку во время выполнения, вы можете определить метод следующим образом:
def newRoot(label:String) = {val r = <root/>; r.copy(label=label) }