2010-03-19 3 views
7

Je cherche à créer un document comme celui-ci:Comment créer un noeud racine XML dans Scala sans un nom d'élément littéral?

<root/> 

que je peux ajouter des enfants à programatically. En théorie, il ressemblerait à ceci:

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

Mais cela ne semble pas fonctionner:

error: not found: value < 

Alors, ce que j'ai essayé à la place était le suivant:

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

qui compile mais à l'exécution, j'obtiens cette exception de pointeur nul:

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

J'utilise Scala 2.8. Des exemples de comment arracher ça? Merci.

Répondre

7

Vous devez passer la liste vide pour les attributs (scala.xml.Null) et si vous ne voulez pas d'enfants, vous ne devez même pas inclure l'argument final. Vous voulez une liste vide d'enfants, pas un seul enfant qui se trouve être null. Alors:

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

Cela fonctionne avec l'avertissement de désapprobation maintenant. –

+0

Avec l'API actuelle (Scala.xml 2.11.x): 'val doc = Elem.apply (null, nom_noeud_racine, scala.xml.Null, scala.xml.TopScope)' – Philippe

5

Sur 2.8 vous pouvez faire ceci:

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

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

Donc, si votre document initial est <root/>, puis il suffit d'utiliser un littéral. Si vous devez être en mesure de définir l'étiquette à l'exécution, vous pouvez définir une méthode comme celle-ci:

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

C'est intéressant. Je pense que r.copy() sera utile dans le futur ... –

Questions connexes