2010-09-07 4 views
10

Comment accéder aux attributs avec des espaces de noms? Mes données XML sont sous une formeAccès aux attributs XML avec des espaces de noms

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

mais ce qui suit ne correspond pas à l'attribut

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

Si je supprime le composant d'espace de noms à partir du nom de l'attribut alors il fonctionne.

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

Une idée de comment accéder aux attributs avec des espaces de noms dans Scala?

Répondre

12

La documentation API fait référence à la syntaxe suivante ns \ "@{uri}foo".

Dans votre exemple, aucun espace de noms n'est défini et il semble que Scala considère que votre attribut n'est pas préfixé. Voir d.attributes.getClass.

Maintenant, si vous faites ceci:

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

Puis:

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

Vous pouvez toujours faire

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

ou dans votre cas aussi match sur xml.Attribute

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

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

Cependant, Attribute ne se soucie pas du préfixe du tout, donc si vous avez besoin, vous avez besoin pour utiliser explicitement PrefixedAttribute:

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

Il existe cependant un problème lorsqu'il existe plusieurs attributs. Quelqu'un sait comment résoudre ce problème?

Questions connexes