Accessing XML attributes with namespaces

2019-04-05 06:35发布

How one can access 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?

2条回答
做个烂人
2楼-- · 2019-04-05 07:03

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
查看更多
老娘就宠你
3楼-- · 2019-04-05 07:23

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?

查看更多
登录 后发表回答