Scala: XML-синтаксический анализ имен с расширением имен
В приведенном ниже примере, как мне получить доступ к атрибуту '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
Ответы
Ответ 1
Взгляните на это сообщение: Доступ к атрибутам 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 в качестве имени атрибута.