Accessing XML attributes with namespaces
How one can acce开发者_Go百科ss attributes with namespaces? My XML data are in a form
val d = <z:Attachment rdf:about="#item_1"></z:Attachment>
but the following does not match the attribute
(d \\ "Attachment" \ "@about").toString
If I remove the namespace component from the attribute's name then it works.
val d = <z:Attachment about="#item_1"></z:Attachment>
(d \\ "Attachment" \ "@about").toString
Any idea how to access attributes with namespaces in Scala?
The API documentation refers to the following syntax ns \ "@{uri}foo"
.
In your example there is no namespace defined, and it seems Scala considers your attribute as unprefixed. See d.attributes.getClass
.
Now if you do this:
val d = <z:Attachment xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" rdf:about="#item_1"></z:Attachment>
Then:
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
You can always do
d match {
case xml.Elem(prefix, label, attributes, scope, children@_*) =>
}
or in your case also match on xml.Attribute
d match {
case xml.Elem(_, "Attachment", xml.Attribute("about", v, _), _, _*) => v
}
// Seq[scala.xml.Node] = #item_1
However, Attribute
does not care about the prefix at all, so if you need that, you need to explicitly use PrefixedAttribute
:
d match {
case xml.Elem(_, "Attachment", xml.PrefixedAttribute("rdf", "about", v, _), _, _*) => v
}
There is a problem, however, when there are multiple attributes. Anyone knows how to fix this?
精彩评论