2009-10-17 6 views
12

Le package scala.xml représente le langage XML avec les nœuds d'un arbre étiqueté. Mais cet arbre est-il unidirectionnel dans Scala 2.7, car il semble qu'il n'y ait aucun moyen d'accéder au parent Elem d'un Elem donné? La même chose semble s'appliquer au parent Document. Par exemple, dans XOM, vous avez les accesseurs getParent et getDocument pour naviguer vers la racine de l'arbre. Cela peut-il être fait avec l'API XML de Scala?Comment accéder à l'élément parent dans Scala XML

Répondre

12

Comme mentionné par d'autres, il n'y a pas de liens parents pour les rendre efficaces structures immuables. Par exemple:

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> 

Aucune structure de données n'a été copiée. Le noeud pointé par b est le même noeud pointé par à la fois a et c. S'il devait pointer vers un parent, alors vous devriez en faire une copie lorsque vous l'avez utilisé dans c.

Pour naviguer dans cette structure de données comme vous le souhaitez, vous avez besoin de ce qu'on appelle un curseur XML purement applicatif.

3

Mais cet arbre est-il unidirectionnel dans Scala?

Oui. En raison de l'approche de l'immutabilité dans scala.xml, les nœuds ne connaissent pas leur parent.

1

Il est unidirectionnel, donc les nœuds ne sont pas conscients de leur parent.

Vous pourriez être en mesure de résoudre votre problème en convertissant en DOM. Il ne semble pas y avoir quelque chose dans la bibliothèque standard pour cela, mais j'ai trouvé this thread sur le sujet qui pourrait être utile.

Questions connexes