Как я создаю корневой узел XML в Scala без литерального имени элемента?

Я надеюсь создавать документ как это:

<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. Какие-либо примеры того, как осуществить это?Спасибо.

7
задан Isaac Oates 19 March 2010 в 12:54
поделиться

2 ответа

Вы должны передавать пустой список для атрибутов (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>
7
ответ дан 6 December 2019 в 21:12
поделиться

В версии 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) }
5
ответ дан 6 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: