2010-03-19 8 views
7

szukam stworzyć dokument tak:Jak utworzyć węzeł główny XML w programie Scala bez nazwy literału?

<root/> 

Że można dodawać dzieci programowo. Teoretycznie byłoby to wyglądać tak:

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

Ale to nie wydają się działać:

error: not found: value < 

Więc, co starałem zamiast było to:

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

To kompiluje ale w czasie wykonywania otrzymuję ten wyjątek wskaźnika pustego:

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

Używam Scala 2.8. Wszelkie przykłady, jak to zrobić? Dzięki.

Odpowiedz

7

Powinieneś przekazać pustą listę atrybutów (scala.xml.Null), a jeśli nie chcesz żadnych dzieci, nie powinieneś nawet podawać końcowego argumentu. Chcesz mieć pustą listę dzieci, a nie jedno dziecko, które ma być null. Więc:

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

Zostanie to teraz uruchomione z ostrzeżeniem o wycofaniu. –

+0

Przy obecnym API (Scala.xml 2.11.x): 'val doc = Elem.apply (null, nazwa_narzędzia_rodziemego, scala.xml.Null, scala.xml.TopScope)' – Philippe

5

Na 2.8 można to zrobić:

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

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

więc jeśli początkowy dokument jest <root/>, następnie wystarczy użyć dosłownym. Jeśli musisz mieć możliwość ustawienia etykiety w czasie wykonywania, możesz zdefiniować metodę podobną do poniższej:

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

To interesujące. Myślę, że r.copy() przyda się w przyszłości ... –

Powiązane problemy