2010-03-19 17 views
7

Tôi đang tìm cách tạo một tài liệu như sau:Làm cách nào để tạo nút gốc XML trong Scala mà không có tên phần tử chữ?

<root/> 

Tôi có thể thêm trẻ vào chương trình. Về mặt lý thuyết, nó sẽ trông như thế này:

val root_node_name = "root" 
val doc = <{root_node_name}/> 

Nhưng điều đó dường như không làm việc:

error: not found: value < 

Vì vậy, những gì tôi đã cố gắng thay vì được điều này:

val root_node_name = "root" 
val doc = new scala.xml.Elem(null, root_node_name, null, scala.xml.TopScope, null) 

Đó biên dịch nhưng lúc chạy, tôi nhận được ngoại lệ con trỏ null này:

java.lang.NullPointerException 
at scala.xml.Utility$.toXML(Utility.scala:201) 
at scala.xml.Utility$$anonfun$sequenceToXML$2.apply(Utility.scala:235) 
at scala.xml.Utility$$anonfun$sequenceToXML$2.apply(Utility.scala:235) 
at scala.Iterator$class.foreach(Iterator.scala:414) 
at scala.runtime.BoxedArray$AnyIterator.foreach(BoxedArray.scala:45) 
at scala.Iterable$class.foreach(Iterable... 

Tôi đang sử dụng Scala 2.8. Bất kỳ ví dụ về làm thế nào để kéo này đi? Cảm ơn.

Trả lời

7

Bạn nên chuyển danh sách trống cho các thuộc tính (scala.xml.Null) và nếu bạn không muốn có con, bạn thậm chí không nên đưa vào đối số cuối cùng. Bạn muốn có một danh sách trống của trẻ em, không phải là một đứa trẻ duy nhất xảy ra là null. Vì vậy:

scala> val root_node_name = "root" 
root_node_name: java.lang.String = root 

scala> val doc = new scala.xml.Elem(null, root_node_name, scala.xml.Null , scala.xml.TopScope) 
doc: scala.xml.Elem = <root></root> 
+0

Điều này xảy ra với cảnh báo không dùng nữa ngay bây giờ. –

+0

Với API hiện tại (Scala.xml 2.11.x): 'val doc = Elem.apply (null, root_node_name, scala.xml.Null, scala.xml.TopScope)' – Philippe

5

On 2.8 bạn có thể làm điều này:

scala> val r = <root/> 
r: scala.xml.Elem = <root></root> 

scala> r.copy(label="bar") 
res0: scala.xml.Elem = <bar></bar> 

Vì vậy, nếu tài liệu ban đầu của bạn là <root/>, sau đó chỉ cần sử dụng một chữ. Nếu bạn cần để có thể đặt nhãn khi chạy, bạn có thể xác định một phương thức như sau:

def newRoot(label:String) = {val r = <root/>; r.copy(label=label) } 
+1

Thật thú vị. Tôi nghĩ r.copy() sẽ có ích trong tương lai ... –

Các vấn đề liên quan