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
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.
You can use
ns.attributes.head.asAttrMap("xsi:id")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With