Доступ к атрибутам XML с помощью пространств имен - PullRequest
10 голосов
/ 07 сентября 2010

Как можно получить доступ к атрибутам с пространствами имен? Мои данные 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?

Ответы [ 2 ]

12 голосов
/ 07 сентября 2010

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

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

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

d match {
  case xml.Elem(prefix, label, attributes, scope, children@_*) =>
}

или в вашем случае также сопоставить с 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
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...