2009-10-17 9 views
12

El paquete scala.xml representa XML con nodos de un árbol etiquetado. Pero, ¿este árbol es unidireccional en Scala 2.7, ya que parece que no hay forma de acceder al padre Elem de un determinado Elem? Lo mismo parece aplicarse para el padre Document. Por ejemplo, en XOM tiene accesos getParent y getDocument para navegar hacia la raíz del árbol. ¿Se puede hacer esto con la API XML de Scala?Cómo acceder al elemento principal en Scala XML

Respuesta

12

Según lo mencionado por otros, no hay enlaces principales para que sean estructuras eficientes e inmutables. Por ejemplo:

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> 

No se copió ninguna estructura de datos. El nodo apuntado por b es el mismo nodo al que apuntan a y c. Si tuviera que señalar a un padre, entonces tendría que hacer una copia cuando lo usó en c.

Para navegar en esa estructura de datos de la manera que desee, necesita lo que se denomina Cursor XML puramente aplicable.

3

¿Pero este árbol es unidireccional en Scala?

Sí. Debido al enfoque de la inmutabilidad en scala.xml, los nodos no conocen sus padres.

1

Es unidireccional, por lo que los nodos no son conscientes de su padre.

Es posible que pueda resolver su problema convirtiendo a un DOM. No parece haber nada en la biblioteca estándar para esto, pero encontré this thread sobre el tema que podría ser útil.

Cuestiones relacionadas