2009-10-17 9 views
12

Il pacchetto scala.xml rappresenta XML con nodi di un albero etichettato. Ma questo albero è unidirezionale in Scala 2.7, poiché sembra che non ci sia modo di accedere al genitore Elem di un dato Elem? Lo stesso sembra applicarsi per il genitore Document. Ad esempio, in XOM hai gli accessor getParent e getDocument per navigare verso la radice dell'albero. Questo può essere fatto con l'API XML di Scala?Come accedere all'elemento padre in Scala XML

risposta

12

Come menzionato da altri, non esistono collegamenti principali per renderli strutture immutabili efficienti. Ad esempio:

scala> val a = <parent><children>me</children></parent> 
a: scala.xml.Elem = <parent><children>me</children></parent> 

scala> val b = a.child(0) 
b: scala.xml.Node = <children>me</children> 

scala> val c = <newparent>{b}</newparent> 
c: scala.xml.Elem = <newparent><children>me</children></newparent> 

scala> a 
res0: scala.xml.Elem = <parent><children>me</children></parent> 

scala> b 
res1: scala.xml.Node = <children>me</children> 

scala> c 
res3: scala.xml.Elem = <newparent><children>me</children></newparent> 

Nessuna struttura dati è stata copiata. Il nodo puntato da b è lo stesso nodo puntato da entrambi a e c. Se doveva indicare un genitore, allora dovresti farne una copia quando lo hai usato in c.

Per navigare in quella struttura dati nel modo desiderato, è necessario ciò che viene chiamato un Cursore XML Puramente Applicativo.

3

Ma questo albero è unidirezionale in Scala?

Sì. A causa dell'approccio all'immutabilità in scala.xml, i nodi non conoscono il loro genitore.

1

È unidirezionale, quindi i nodi non sono consapevoli del proprio genitore.

Potrebbe essere possibile risolvere il problema convertendo in DOM. Non sembra che ci sia qualcosa nella libreria standard per questo, ma ho trovato this thread sull'argomento che potrebbe essere utile.

Problemi correlati