Gói scala.xml
biểu thị XML bằng các nút của cây được gắn nhãn. Nhưng liệu cây này có một chiều trong Scala 2.7, vì dường như không có cách nào để truy cập vào phụ huynh Elem
của một số Elem
nhất định? Điều tương tự cũng áp dụng cho phụ huynh Document
. Ví dụ, trong XOM bạn có getParent
và getDocument
trình điều khiển để điều hướng về phía gốc của cây. Điều này có thể được thực hiện với API XML của Scala không?Cách truy cập phần tử cha trong Scala XML
Trả lời
Như đã đề cập bởi những người khác, không có liên kết gốc để làm cho chúng có cấu trúc không thay đổi hiệu quả. Ví dụ:
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>
Không có cấu trúc dữ liệu nào được sao chép. Nút được trỏ đến bởi b
là nút rất giống được trỏ tới bởi cả hai a
và c
. Nếu nó phải trỏ đến một phụ huynh, thì bạn phải tạo một bản sao của nó khi bạn sử dụng nó trong c
.
Để điều hướng trong cấu trúc dữ liệu đó theo cách bạn muốn, bạn cần cái được gọi là Con trỏ XML hoàn toàn áp dụng.
Nhưng cây này có một chiều ở Scala không?
Có. Do cách tiếp cận bất biến trong scala.xml, các nút không biết cha mẹ của chúng.
Đó là một chiều, vì vậy các nút không biết đến cha mẹ của chúng.
Bạn có thể giải quyết vấn đề của mình bằng cách chuyển sang DOM. Có vẻ như không có bất cứ điều gì trong thư viện chuẩn cho việc này, nhưng tôi tìm thấy this thread về chủ đề có thể hữu ích.