Пакет scala.xml
представляет XML с узлами помеченного дерева. Но является ли это дерево однонаправленным в Scala 2.7, поскольку, похоже, нет доступа к родительскому элементу Elem
данного Elem
? То же самое относится к parent Document
. Например, в XOM у вас есть getParent
и getDocument
accessors, чтобы перейти к корню дерева. Можно ли это сделать с помощью Scala XML API?
Как получить доступ к родительскому элементу в Scala XML
Ответ 1
Как уже упоминалось другими, нет родительских ссылок, чтобы сделать их эффективными неизменяемыми структурами. Например:
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>
Никакая структура данных не была скопирована. node, на который указывает b
, - это тот самый node, на который указывают как a
, так и c
. Если он должен был указывать на родителя, тогда вам придется сделать его копию, когда вы использовали его в c
.
Чтобы перемещаться в этой структуре данных так, как вам нужно, вам понадобится так называемый чисто аппликативный XML-курсор.
Ответ 2
Но это дерево однонаправлено в Scala?
Да. Из-за подхода к неизменности в scala.xml узлы не знают своего родителя.
Ответ 3
Он однонаправлен, поэтому узлы не знают своего родителя.
Возможно, вы сможете решить свою проблему, перейдя в DOM. В этой стандартной библиотеке нет ничего, но я нашел этот поток по теме, который может быть полезен.