Как создать корневой узел XML в Scala без буквального имени элемента? - PullRequest
7 голосов
/ 19 марта 2010

Я хочу создать такой документ:

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

Ответы [ 2 ]

7 голосов
/ 19 марта 2010

Вы должны передать пустой список для атрибутов (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>
5 голосов
/ 19 марта 2010

На 2.8 вы можете сделать это:

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

scala> r.copy(label="bar")
res0: scala.xml.Elem = <bar></bar>

Так что, если ваш начальный документ <root/>, то просто используйте литерал. Если вам нужно установить метку во время выполнения, вы можете определить метод, подобный этому:

def newRoot(label:String) = {val r = <root/>; r.copy(label=label) }
...