开发者

Scala: XML parsing namespaced attributes

开发者 https://www.devze.com 2023-02-12 08:49 出处:网络
In the example below, how do I access the attribute \'id\' once it has a namespace prefix? scala> val ns = <foo id=\"bar\"></foo>

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>

开发者_JAVA技巧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")
0

精彩评论

暂无评论...
验证码 换一张
取 消