Flex Builder 3 Débutant ? Découvrez Flex et Adobe® Flex® Builder 3
25
mai
09

Flex ActionScript – Classe utile pour supprimer les namespace d'un XML (pour lecture e4x)

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:

2 Réponses à “Flex ActionScript – Classe utile pour supprimer les namespace d'un XML (pour lecture e4x)”


  1. 1 gropapa mai 26th, 2009 at 9:52

    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

  2. 2 fnicollet mai 26th, 2009 at 9:58

    Effectivement, il faut rester vigilant :)

    Fabien

Laisser un commentaire

Si vous souhaitez poster du code ActionScript, mettez le entre des balises comme ceci [as]code[/as]. Pour du code MXML, mettez le dans des balises [mxml]code[/mxml]. Merci




Bientôt sur flex-tutorial.fr …

  • - Tutoriaux BlazeDS
  • - Composants Flex

tutorial flex tutorial flex

flex Adobe Air AFCS Data Filter Lib ToasterLib librairies AS3 Flex livres AS3 Flex

 

mai 2009
L Ma Me J V S D
« avr   juin »
 123
45678910
11121314151617
18192021222324
25262728293031