Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scala: XML parsing namespaced attributes

Tags:

xml

scala

In the example below, how do I access the attribute 'id' once it has a namespace prefix?

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

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

Above works fine. According to the docs below should work but it doesn't.

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()

All on Scala 2.8.0.final

Cheers

Answer: It seems without an xlmns in the xml you can't access the attribute. So for the above example to work it needs to be inside an xlm namespace. e.g.:

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
like image 858
David Avatar asked Feb 22 '11 14:02

David


2 Answers

Take a look at this post: Accessing XML attributes with namespaces.

It looks like the uri that is referred to in:

ns \ "@{uri}foo"

Refers to the part after the equal sign. This works:

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

So I think the first thing after foo is to define your URL and namespace, and then to define the attribute, so if you want to get the attribute "bar", maybe something like this:

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

Although I'm not sure about the correctness of reusing the URI as attribute name.

like image 164
CaffiendFrog Avatar answered Nov 08 '22 01:11

CaffiendFrog


You can use

ns.attributes.head.asAttrMap("xsi:id")
like image 20
Eugeny Belousov Avatar answered Nov 07 '22 23:11

Eugeny Belousov