Scala: XML разбирает атрибуты пространства имен - PullRequest
13 голосов
/ 22 февраля 2011

Как в примере ниже получить доступ к атрибуту id, если у него есть префикс пространства имен?

scala> val ns = <foo id="bar"></foo>    
ns: scala.xml.Elem = <foo id="bar"></foo>

scala> ns \ "@id"                   
res15: scala.xml.NodeSeq = bar

Выше работает нормально.Согласно документам, приведенным ниже, должно работать, но это не так.

scala> val ns = <foo xsi:id="bar"></foo>
ns: scala.xml.Elem = <foo xsi:id="bar"></foo>

scala> ns \ "@{xsi}id"                   
res16: scala.xml.NodeSeq = NodeSeq()

Все на Scala 2.8.0.final

Приветствия

Ответ: Кажется, без xlmns в xml вы не сможете получить доступ к атрибуту.Таким образом, чтобы приведенный выше пример работал, он должен находиться внутри пространства имен xlm.например:

scala> val xml = <parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <foo xsi:id="bar"></foo></parent>
xml: scala.xml.Elem = <parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <foo xsi:id="bar"></foo></parent>

scala> xml \ "foo" \ "@{http://www.w3.org/2001/XMLSchema-instance}id"
res3: scala.xml.NodeSeq = bar

Ответы [ 2 ]

13 голосов
/ 22 февраля 2011

Посмотрите на этот пост: Доступ к атрибутам XML с помощью пространств имен .

Похоже на URI, на который ссылается:

ns \ "@{uri}foo"

Относится кчасть после знака равенства.Это работает:

scala> val ns = <foo xmlns:id="bar" id:hi="fooMe"></foo>
ns: scala.xml.Elem = <foo id:hi="fooMe" xmlns:id="bar"></foo>

scala> ns \ "@{bar}hi"
res9: scala.xml.NodeSeq = fooMe

Так что я думаю, что первое, что следует после foo, это определить ваш URL и пространство имен, а затем определить атрибут, так что если вы хотите получить атрибут «bar», может быть что-то вродеэто:

scala> val ns = <foo xmlns:myNameSpace="id" myNameSpace:id="bar"></foo>
ns: scala.xml.Elem = <foo myNameSpace:id="bar" xmlns:myNameSpace="id"></foo>

scala> ns \ "@{id}id"
res10: scala.xml.NodeSeq = bar

Хотя я не уверен в правильности повторного использования URI в качестве имени атрибута.

1 голос
/ 08 мая 2018

Вы можете использовать

ns.attributes.head.asAttrMap("xsi:id")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...