2010-03-19 13 views
7

Sto cercando di creare un documento come questo:Come si crea un nodo radice XML in Scala senza un nome di elemento letterale?

<root/> 

che posso aggiungere i bambini a programatically. Teoricamente, sarebbe simile a questa:

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

Ma questo non sembra funzionare:

error: not found: value < 

Allora, che cosa ho provato invece era questa:

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

che compila ma in fase di esecuzione ottengo questa eccezione puntatore nullo:

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

Sto usando Scala 2.8. Qualche esempio su come tirarlo fuori? Grazie.

risposta

7

È necessario passare l'elenco vuoto per gli attributi (scala.xml.Null) e se non si desidera alcun figlio, non si dovrebbe nemmeno includere l'argomento finale. Vuoi una lista vuota di bambini, non un singolo bambino che capita di essere null. Quindi:

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

Questo viene eseguito con avviso di disapprovazione ora. –

+0

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

5

Su 2.8 si può fare questo:

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

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

Così, se il documento iniziale è <root/>, poi basta usare un letterale. Se avete bisogno di essere in grado di impostare l'etichetta in fase di esecuzione, è possibile definire un metodo come questo:

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

È interessante. Penso che r.copy() tornerà utile in futuro ... –

Problemi correlati