Доступ к атрибутам 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
}
Однако существует проблема, когда есть несколько атрибутов. Кто-нибудь знает, как это исправить?