开发者

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?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜