2011-01-07 19 views
7

Dường như giá trị thuộc tính là loại Seq[Node].Scala XML API: Tại sao cho phép NodeSeq làm giá trị thuộc tính?

scala> <a b="1"/>.attribute("b")    
res11: Option[Seq[scala.xml.Node]] = Some(1) 

Điều này có nghĩa là bạn có thể gán XML làm giá trị thuộc tính.

scala> <a b={<z><x/></z>}/>.attribute("b")    
res16: Option[Seq[scala.xml.Node]] = Some(<z><x></x></z>) 

scala> <a b={<z><x/></z>}/>.attribute("b").map(_ \ "x") 
res17: Option[scala.xml.NodeSeq] = Some(<x></x>) 

scala> new xml.PrettyPrinter(120, 2).format(<a b={<z><x/></z>}/>) 
res19: String = <a b="<z><x></x></z>"></a> 

Điều này có vẻ rất thú vị đối với tôi. Tôi chưa bao giờ thấy XML là các giá trị thuộc tính trong thế giới thực. Tại sao nó được phép? Tại sao giá trị thuộc tính không phải là loại String?

Trả lời

4

Từ scala.xml "draft" book bởi Burak Emir:

bắt đầu quote

Thoạt nhìn, có vẻ như thuộc tính chỉ nên chuỗi và không có gì khác. Tuy nhiên, có hai lý do để cho phép cùng một loại nút (ngoài các nút phần tử) có thể xuất hiện trong XML: các giá trị dữ liệu và các tham chiếu thực thể.

<foo name= "s&uuml;ss" life={Atom(42)}> 

cuối quote

Bây giờ tôi đã cố gắng rằng trong 2.8.0 và nó không khá biên dịch - Tôi cần phải sử dụng new Atom(42). Nhưng tôi có thể nhập một cái gì đó như thế này:

<foo name={List(Text("s"), EntityRef("uuml"), Text("ss"))}/> 

Vì vậy, đó là một phần của lý do để tận dụng các nút cho thuộc tính. Và yeah nó là một chút sôi nổi.

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