2010-09-07 21 views
10

¿Cómo se puede acceder a los atributos con espacios de nombres? Mis datos XML están en una formaAcceso a atributos XML con espacios de nombres

val d = <z:Attachment rdf:about="#item_1"></z:Attachment> 

pero el siguiente no coincide con el atributo

(d \\ "Attachment" \ "@about").toString 

Si quito el componente de espacio de nombres del nombre del atributo entonces funciona.

val d = <z:Attachment about="#item_1"></z:Attachment> 
(d \\ "Attachment" \ "@about").toString 

¿Alguna idea de cómo acceder a los atributos con espacios de nombres en Scala?

Respuesta

12

La documentación de API se refiere a la siguiente sintaxis ns \ "@{uri}foo".

En su ejemplo, no hay un espacio de nombres definido, y parece que Scala considera su atributo como no prefijado. Ver d.attributes.getClass.

Ahora bien, si usted hace esto:

val d = <z:Attachment xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" rdf:about="#item_1"></z:Attachment> 

continuación:

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 
8

Siempre se puede hacer

d match { 
    case xml.Elem(prefix, label, attributes, scope, [email protected]_*) => 
} 

o en su caso, coinciden también en xml.Attribute

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

// Seq[scala.xml.Node] = #item_1 

Sin embargo, Attribute no le importa el prefijo en absoluto, así que si necesitas eso, es necesario para usar explícitamente PrefixedAttribute:

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

Hay un problema, sin embargo, cuando hay múltiples atributos. ¿Alguien sabe cómo arreglar esto?

Cuestiones relacionadas