2010-09-07 57 views
10

如何使用命名空間訪問屬性?我的XML數據的形式使用命名空間訪問XML屬性

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

但下面如果我從屬性的名稱中刪除命名空間的組件,然後它工作沒有屬性

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

匹配。

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

任何想法如何使用Scala中的命名空間訪問屬性?

回答

12

API文檔參考以下語法ns \ "@{uri}foo"

在你的例子中沒有定義名稱空間,看起來Scala認爲你的屬性是前綴。請參閱d.attributes.getClass

現在,如果你這樣做:

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

然後:

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

你總是可以做

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

或在您的情況下,也匹配xml.Attribute

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

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

然而,Attribute不關心前綴可言,所以如果你需要,你需要明確使用PrefixedAttribute

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

但是,如果存在多個屬性,則存在問題。任何人都知道如何解決此問題?