2010-09-07 13 views
10

Wie kann auf Attribute mit Namespaces zugegriffen werden? Meine XML-Daten sind in einer FormZugriff auf XML-Attribute mit Namespaces

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

aber folgende nicht das Attribut überein

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

Wenn ich die Namespace-Komponente aus dem Namen des Attributs entferne dann funktioniert es.

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

Haben Sie eine Idee, wie Sie auf Attribute mit Namespaces in Scala zugreifen?

Antwort

12

Die API-Dokumentation bezieht sich auf die folgende Syntax ns \ "@{uri}foo".

In Ihrem Beispiel ist kein Namespace definiert, und es scheint, dass Scala Ihr Attribut als nicht festgelegt ansieht. Siehe d.attributes.getClass.

Nun, wenn Sie dies tun:

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

Dann:

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

Sie können immer tun

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

oder in Ihrem Fall auch auf xml.Attribute

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

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

entsprechen, Attribute nicht über das Präfix überhaupt nicht zu kümmern, also, wenn Sie brauchen, dass, was Sie brauchen explizit verwenden PrefixedAttribute:

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

Es gibt jedoch ein Problem, wenn mehrere Attribute vorhanden sind. Weiß jemand, wie man das repariert?