2010-03-19 12 views
7

Estoy mirando para crear un documento como este:¿Cómo creo un nodo raíz XML en Scala sin un nombre de elemento literal?

<root/> 

que puedo añadir a los niños mediante programación. En teoría, sería el siguiente:

val root_node_name = "root" 
val doc = <{root_node_name}/> 

Pero eso no parece funcionar:

error: not found: value < 

Por lo tanto, lo que he intentado en cambio, fue la siguiente:

val root_node_name = "root" 
val doc = new scala.xml.Elem(null, root_node_name, null, scala.xml.TopScope, null) 

que compila pero en el tiempo de ejecución obtengo esta excepción de puntero nulo:

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... 

Estoy usando Scala 2.8. ¿Algún ejemplo de cómo sacar esto adelante? Gracias.

Respuesta

7

Debe pasar la lista vacía de atributos (scala.xml.Null) y si no desea tener hijos, ni siquiera debería incluir el argumento final. Desea una lista vacía de hijos, no un solo hijo que sea null. Por lo tanto:

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> 
+0

Esto se ejecuta ahora con la advertencia de desactivación. –

+0

Con la API actual (Scala.xml 2.11.x): 'val doc = Elem.apply (null, root_node_name, scala.xml.Null, scala.xml.TopScope)' – Philippe

5

En 2.8 se puede hacer esto:

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

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

Así que si su documento inicial es <root/>, a continuación, sólo tiene que utilizar un literal. Si necesita poder establecer la etiqueta en el tiempo de ejecución, puede definir un método como este:

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

Eso es interesante. Creo que r.copy() será útil en el futuro ... –

Cuestiones relacionadas