2010-04-09 5 views
12

tous: Je suis à la Scala 2.8Scala D'abord modèle XML correspondant et attributs

J'ai une légère question tout en utilisant des éléments correspondant modèle XML. Je sais que je peux faire quelque chose comme ceci:

val myXML = <a><b>My Text</b></a> 
myXML match { 
    case <a><b>{theText}</b></a> => println(theText) 
    case _ => 
} 

C'est le genre d'exemple que je trouve un peu partout sur le net et dans mes deux livres Scala. Mais que faire si je veux faire correspondre un élément XML en fonction d'un attribut?

val myXML = <a><b type="awesome">An awesome Text!</b></a> 
myXML match { 
    case <a><b type={textType}>{theText}</b><a> => println("An %s text: %s".format(textType, theText)) 
    case _ => 
} 

Le compilateur jeter un error: in XML literal: '>' expected instead of 't' à moi, ce qui indique que je ne peux pas utiliser les attributs car le compilateur devrait l'étiquette d'élément à fermer. Si j'essaie de faire correspondre un élément XML avec un attribut fixe, sans accolades, la même erreur augmente.

Donc, ma question est simple: Comment puis-je faire une telle correspondance? Dois-je créer un Elem pour le match au lieu d'utiliser ces gentils littéraux? Et si: Quelle est la meilleure façon de le faire?

Répondre

17

La gestion des attributs est bien plus douloureuse qu'elle ne devrait l'être. Cet exemple particulier montre, en effet, que Scala ne déconstruit pas les XML de la même façon qu'il les construit, car cette syntaxe est valide pour les littéraux XML. Quoi qu'il en soit, voici une façon:

myXML match { 
    case <a>{b @ <b>{theText}</b>}</a> => 
    println("An %s text: %s".format(b \ "@type", theText)) 
} 
+0

Je suppose que ce sera encore plus pénible d'avoir un cas où seuls les nœuds où l'attribut type a une certaine valeur correspond. :-(Ai-je raison? – Malax

+3

@Malax Pas vraiment, il suffit d'ajouter 'if b \" @type "== Text (" quelquechose ")' avant '' => '. Ou, alternativement,' if (b \ "@type ") .toString ==" peu importe "'. –