Доступ к атрибутам 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?

Ответ 1

Документация API относится к следующему синтаксису ns \ "@{uri}foo".

В вашем примере нет определенного пространства имен, и кажется, что Scala считает ваш атрибут как unsrefixed. См. 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

Ответ 2

Вы всегда можете сделать

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
}

Однако существует проблема, когда есть несколько атрибутов. Кто-нибудь знает, как это исправить?