使用名称空间访问XML属性

使用名称空间访问XML属性,xml,scala,parsing,Xml,Scala,Parsing,如何使用名称空间访问属性?我的XML数据是一种格式 val d = <z:Attachment rdf:about="#item_1"></z:Attachment> 如果我从属性的名称中删除名称空间组件,那么它就会工作 val d = <z:Attachment about="#item_1"></z:Attachment> (d \\ "Attachment" \ "@about").toString val d= (d\\\“附件”\“@

如何使用名称空间访问属性?我的XML数据是一种格式

val d = <z:Attachment rdf:about="#item_1"></z:Attachment>
如果我从属性的名称中删除名称空间组件,那么它就会工作

val d = <z:Attachment about="#item_1"></z:Attachment>
(d \\ "Attachment" \ "@about").toString
val d=
(d\\\“附件”\“@about”).toString
您知道如何在Scala中使用名称空间访问属性吗?

您随时可以这样做

d match {
  case xml.Elem(prefix, label, attributes, scope, children@_*) =>
}
或者在您的情况下,也可以匹配
xml.Attribute

d match {
  case xml.Elem(_, "Attachment", xml.Attribute("about", v, _), _, _*) => v
}

// Seq[scala.xml.Node] = #item_1
但是,
Attribute
根本不关心前缀,因此如果需要前缀,则需要显式使用
PrefixedAttribute

d match {
  case xml.Elem(_, "Attachment", xml.PrefixedAttribute("rdf", "about", v, _), _, _*) => v
}

但是,当存在多个属性时,会出现问题。有人知道如何解决这个问题吗?

API文档引用了以下语法
ns\“@{uri}foo”

在您的示例中,没有定义名称空间,Scala似乎认为您的属性是不固定的。请参见
d.attributes.getClass

现在,如果您这样做:

val d = <z:Attachment xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" rdf:about="#item_1"></z:Attachment>
val d = <z:Attachment xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" rdf:about="#item_1"></z:Attachment>
scala> d \ "@{http://www.w3.org/1999/02/22-rdf-syntax-ns#}about"
res21: scala.xml.NodeSeq = #item_1

scala> d.attributes.getClass
res22: java.lang.Class[_] = class scala.xml.PrefixedAttribute