2010-09-07 19 views
10

Làm cách nào để có thể truy cập các thuộc tính với các không gian tên? dữ liệu XML của tôi đang ở trong một hình thứcTruy cập các thuộc tính XML với các không gian tên

val d = <z:Attachment rdf:about="#item_1"></z:Attachment> 

nhưng sau không phù hợp với thuộc tính

(d \\ "Attachment" \ "@about").toString 

Nếu tôi loại bỏ các thành phần không gian tên từ tên của thuộc tính sau đó nó hoạt động.

val d = <z:Attachment about="#item_1"></z:Attachment> 
(d \\ "Attachment" \ "@about").toString 

Bất kỳ ý tưởng nào về cách truy cập thuộc tính với không gian tên trong Scala?

Trả lời

12

Tài liệu API đề cập đến cú pháp sau ns \ "@{uri}foo".

Trong ví dụ của bạn không có không gian tên được xác định và có vẻ như Scala coi thuộc tính của bạn là chưa được sửa. Xem d.attributes.getClass.

Bây giờ nếu bạn làm điều này:

val d = <z:Attachment xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" rdf:about="#item_1"></z:Attachment> 

Sau đó:

scala> d \ "@{http://www.w3.org/1999/02/22-rdf-syntax-ns#}about" 
res21: scala.xml.NodeSeq = #item_1 

scala> d.attributes.getClass 
res22: java.lang.Class[_] = class scala.xml.PrefixedAttribute 
8

Bạn luôn có thể làm

d match { 
    case xml.Elem(prefix, label, attributes, scope, [email protected]_*) => 
} 

hoặc trong trường hợp của bạn cũng phù hợp trên xml.Attribute

d match { 
    case xml.Elem(_, "Attachment", xml.Attribute("about", v, _), _, _*) => v 
} 

// Seq[scala.xml.Node] = #item_1 

Tuy nhiên, Attribute không quan tâm đến tiền tố ở tất cả, vì vậy nếu bạn cần điều đó, bạn cần để sử dụng rõ ràng PrefixedAttribute:

d match { 
    case xml.Elem(_, "Attachment", xml.PrefixedAttribute("rdf", "about", v, _), _, _*) => v 
} 

Tuy nhiên, có một vấn đề, khi có nhiều thuộc tính. Có ai biết sửa nó không?

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