Il y a quelques mois, je tentais de faire un parse à partir des données issues d'un XML contenant des namespace. Ce XML était en fait le retour d'un appel à un serveur WFS (serveur qui va renvoyer des données géographiques au format XML en vectoriel) mais j'ai eu les mêmes problèmes avec des serveurs WMS (serveur cartographiques en ligne). Mon principal problèmes venait du fait que malgré que le WFS et le WMS soient des formats normés, certains prennent leurs aises et les retours XML sont souvent hasardeux.
Ainsi, les namespaces sont parfois définis, parfois non et cela pose un réel problème pour la lecture e4x, qui nous facilite tant la vie. J'avais écrit deux articles la-dessus, afin de pouvoir lire ces XML avec un namespace défini ou indéfini avec des jokers:
Flex ActionScript – Lire des attributs XML ayant un Namespace différent avec e4x
Flex ActionScript – Récupérer des éléments / attributs XML avec e4x avec n'importe quel namespace
Même si ces techniques fonctionnent, il est toujours embêtant d'avoir à se soucier des namespace quand on cherche un simple accès e4x ou quand les namespaces ne sont pas predictibles.
Pour cela, Craig Kaminsky a créé une classe permettant de supprimer ces namespace dans tout le XML. Cette classe est principalement un utilitaire (une seule méthode static) que vous pourrez utiliser facilement. Elle va vous servir à faire un pré-traitement sur la data pour pouvoir en sortir un XML lisible par e4x.
Voici cette classe servant à supprimer les namespace d'un XML:
public class NamespaceRemover
{
public static const NAME:String = "NamespaceRemover";
public function NamespaceRemover(){}
public static function removeNamespaces( xml:XML ):XML
{
var cleanXML:XML;
var xmlSource:String;
xmlSource = xml.toXMLString();
xmlSource = xmlSource.replace(/<[^!?]?[^>]+?>/g, cleanXMLNamespaces);
cleanXML = XML(xmlSource)
return cleanXML;
}
private static function cleanXMLNamespaces(...rest):String
{
rest[0] = rest[0].replace(/xmlns[^"]+\"[^"]+\"/g, "");
var attrs:Array = rest[0].match(/\"[^"]*\"/g);
rest[0] = rest[0].replace(/\"[^"]*\"/g, "%attribute value%");
rest[0] = rest[0].replace(/(<\/?|\s)\w+\:/g, "$1");
while (rest[0].indexOf("%attribute value%") > 0)
{
rest[0] = rest[0].replace("%attribute value%", attrs.shift());
}
return rest[0];
}
}
Pour pouvoir l'utiliser, voici un petit bout de code qu'il donne dans son article. En gros:
xmlSansNamespaces = NamespaceRemover.removeNamespaces( xmlSource );
Pour plus d'informations sur cette classe, vous pouvez aller voir la page de l'auteur:
Voir l'article original de Craig Kaminsky
Autres Tutoriaux Flex liés:









c est vrai que c est ennuyeux toutes ces histoires de qulified name etc pour accéder aux noeuds ayant un namespace. Cela dit en règle générale les namespace sont la pour une raison, il faudra donc faire attention quant à l utilisation de cette classe, tout particulierement ds les cas ou dans different namespace on aura des noms de noeuds identiques
Effectivement, il faut rester vigilant
Fabien