问题 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上

干杯

回答: 似乎xml中没有xlmns你无法访问该属性。因此,要使上述示例工作,它需要位于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

3600
2018-02-22 14:28


起源

来自Scala API(NodeSeq): ns \“@ {uri} foo”获取前缀“pre:foo”,其前缀“pre”被解析为名称空间“uri”。  但 ns \ "@{xsi}id" 不管用 :( - Thomas Rawyler
谢谢托马斯,我在文档中错过了一些。我已经更新了示例,以显示即使正确地遵循API,它仍然无法正常工作。 - Dave


答案:


看看这篇文章: 使用命名空间访问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作为属性名称的正确性。


12
2018-02-22 16:00



嗨CaffiendFrog。你是对的,我必须使用xmlns作为模式的一部分。谢谢。 - Dave


您可以使用

ns.attributes.head.asAttrMap("xsi:id")

1
2018-05-08 15:00