[AS3] - Une petite routine de recherche dans un XML grâce à l'E4x
Par Laurent Deketelaere le mardi, février 2 2010, 16:43 - Flash plateforme - Lien permanent
Mis à jour après le passage de Cédric
J'ai dû mettre en place récemment un moteur de recherche qui effectue une recherche sur une série de mots clés liés à chaque partie d'un site.
Voici ce que ça a donné :
_xml.descendants().( child("tags").toString().indexOf("maRecherche") >=0 );
En Français ça donnerait :
« Retourne moi l'XMLList regroupant tous les noeud contenus dans _xml qui possède dans leur noeud enfant “tags” la chaine de caractère “maRecherche” »
Un petit cas pratique à copier-coller directement dans Flash :
var xmlData : XML =
<root>
<data>
<item id="1">
<title><![CDATA[Item 1]]></title>
<content><![CDATA[Xerorecat pererib erepudit. ]]></content>
<tags><![CDATA[pomme poire abricots]]></tags>
</item>
<item id="2">
<title><![CDATA[Item 2]]></title>
<content><![CDATA[Mod ut mo ea invelicia. ]]></content>
<tags><![CDATA[train tram bus]]></tags>
</item>
<item id="3">
<title><![CDATA[Item 3]]></title>
<content><![CDATA[Te poriae sum velit dusdae? ]]></content>
<tags><![CDATA[velo pied roller]]></tags>
</item>
</data>
</root>;
function search( xmlSource : XML, pattern : String ):Array {
var aList:Array=[];
for each (var node:XML in xmlSource.descendants().( child("tags").toString().indexOf(pattern)>=0 )) {
aList.push(node.@id.toString());
}
return aList;
}
trace("Result :: " + search(xmlData, "velo").toString());
// Result :: 3
Dans la version finale j'ai ajouté du toLowerCase() et un petit StringUtils.noAccent();
Commentaires
On pourrait aussi l'écrire ainsi :
var res : XMLList = xmlSource..item.( tags.toString().indexOf( "maRecherche" ) >=0 )
Utiliser
search
n'a d'intérêt que si tu utilise des RegExp en recherche.My 2 cents
Effectivement, search est un vestige d'une ancienne version qui utilisait RegExp au lieu d'une String.
Sinon, il est vrai que j'ai pris l'habitude d'utiliser child("") pour me balader dans un XML pour éviter les warnings et profiter de l'autocomplétion de FDT.
thx
Bizarement, j'ai jamais eu de problème dans FDT avec cette syntaxe, et puis même dans ce cas, il vaut mieux utiliser la méthode
descendants
(l'équivalent du..
) pour rendre ta requête moins dépandante du contexte.Une façon encore plus générique de faire serait de faire :
xml.descendants("*").(tags.toString().indexOf( pattern ) >= 0 )
Ce qui nous renvoi tout les noeuds possédant un enfant tags avec la chaîne recherchée
Effectivement
Je dirai même plus :
xml.descendants().(tags.toString().indexOf( pattern ) >= 0 )
descendants
ayant "*" comme paramètre par défaut.Sinon pour ce qui est des warnings dans FDT, si tu écris xml.monNode. tu perds l'autocomplétion, avec xml.child("monNode") il garde le typage.