IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

parcours XML en JS


Sujet :

JavaScript

  1. #1
    r83
    r83 est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 271
    Points : 86
    Points
    86
    Par défaut parcours XML en JS
    Bonsoir,

    J'ai un fichier XML suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <racine>
    	<personne>
             <nom>toto</nom>
             <prenom>pretoto</prenom>
    	</personne>
        <personne>
             <nom>titi</nom>
             <prenom>pretiti</prenom>
        </personne>
    . . . . . . . . .
    </racine>
    J'aimerais le parcourir personne par personne, je fais donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var lesPersonnes=docXML.getElementsByTagName('personne');
     
    for(i .......)
    {
    var unePersonne=lesPersonnes[i];
    var lesNoms=unePersonne.getElementsByTagName('nom');
    leNom=lesNoms[0].firstChild.nodeValue;
    var lesPrenoms=unePersonne.getElementsByTagName('prenom');
    lePrenom=lesPrenoms[0].firstChild.nodeValue;
    .......
    }
    ça marche, mais je pense qu'on peut faire beaucoup mieux..... car pour chaque personne je n'ai qu'un seul nom et qu'un seul prenom, et donc c'est pas top de passer par une collection....
    De plus il faut que je répète la manip pour chaque balise de personne (nom, prenom, adresse, mail, tel,....).
    Je sais que je peux utiliser la même collection, successivement pour les noms, prenom,... mais ça ne change rien au fond du problème.
    merci de m'éclairer et de m'aider à optimiser ce code.

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 345
    Points : 496
    Points
    496
    Par défaut
    La récupération de data depuis un XML à la main en JS m'a cassé tellement les pieds qu'au final j'avais codé une fonction récursive qui transforme un XML en objet javascript.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    /* XMLF : 
    	objet de parcours du DOM XML 
    	getContent(node) : retourne la valeur du noeud. // gere les values simples ou les CDATA
    	xml2obj(node) : retourne un objet depuis le noeud XML passé en parametre
    */
    var XMLF = {
    	xml2obj : function(node, arrayForcedNodes) {
    		var arrayForced = arrayForcedNodes ? new RegExp('\\b(' + arrayForcedNodes.join('|') + ')\\b') : null;
    		var x2o = XMLF.xml2obj;
    		var obj = {};
     
    		var xmlNodes = 0;
    		for (var i=0; i<node.childNodes.length; i++) {
    			var n = node.childNodes[i];
    			var name = n.nodeName;
    			if (n.nodeType==1) {
    				xmlNodes++;
    				if (obj[name]==null) {
    					var tmpObj = x2o(n,arrayForcedNodes);
    					obj[name] = arrayForced && name.match(arrayForced) ? [tmpObj] : tmpObj;
    				} else {
    					if(!(obj[name] instanceof Array)) {
    						obj[name]=[obj[name]];
    					}
    					obj[name].push(x2o(n,arrayForcedNodes));
    				}
    			}
    		}
    		if (xmlNodes==0) {
    			var val = XMLF.getContent(node);
    			if (!val) {
    				if (node.attributes.length==0) {
    					val = '';
    				} else {
    					var val = {};
    					val._attributes = XMLF.getAttributes(node);
    				}
    			} else if (val.match(/^\s*true|false\s*$/))  {
    				val=eval(val);
    			}
    			return val;
    		} else if(node.attributes && node.attributes.length>0) {
    			obj._attributes = XMLF.getAttributes(node);
    		}
     
    		return obj
    	},
    	getContent : function(node) {
    		var str = [];
    		for (var i=0; i<node.childNodes.length; i++) {
    			str.push(node.childNodes[i].nodeValue);
    		}
    		return str.join('');
    	},
     
    	getAttributes : function(node) {
    		var val = {};
    		for (var i=0; i<node.attributes.length; i++) {
    			var attr = node.attributes[i];
    			val[attr.nodeName] = attr.nodeValue;
    		}
    		return val;
    	}
    }
    Pour l'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    myObj = XMLF.xml2obj(docxml);
    console.log(myObj);
    Je te conseille néanmoins d'utiliser firebug afin de bien voir l'objet généré, en faisant un console.log() tu obtiendras un lien sur l'objet dans la console de firebug, et ainsi tu pourras parcourir l'objet et voir le résultat. Tu auras directement un tableau d'objets "personne" avec les propriétés nom,prenom, etc...

    Attention mon objet génère un tableau à partir du moment ou il trouve 2 éléments qui portent le même nom quand ils se trouvent à l'intérieur d'un noeud.
    il y a moyen de forcer un "noeud" automatiquement en tableau en passant à la fonction une liste de noeud qui seront transformé obligatoirement en tableau, même s'il n'y a qu'une seul noeud.

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    myObj = XMLF.xml2obj(docxml, ['nom', 'prenom']);
    console.log(myObj);
    dans cet exemple, nom et prenom seront obligatoirement des tableaux.

    Un exemple avec ton xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <?xml version="1.0" encoding="utf-8"?>
    <racine>
    	<personne>
             <nom>toto</nom>
             <prenom>pretoto</prenom>
    	</personne>
        <personne>
             <nom>titi</nom>
             <prenom>pretiti</prenom>
        </personne>
        <personne>
             <nom>mamam</nom>
             <prenom>blabla</prenom>
        </personne>
    </racine>
    Au final j'obtiens ça :


    Au final au niveau code JS pour récupérer et lire le XML ça donne :
    (j'admet dans un premier temps que tu as chargé ton xml via ajax)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    myObj = XMLF.xml2obj(monXmlDePersonnes);
    //Ensuite tu auras accès à toutes les propriétés de l'objet, les noeuds sont devenus des propriétés : 
    myObj.racine; //la racine
    myObj.racine.personne; //le tableau de personnes
     
    for (var i=0; i<myObj.racine.personne.length; i++) {
       var unePersonne = myObj.racine.personne[i];
       console.log(unePersonne.nom,unePersonne.prenom);
    }

  3. #3
    r83
    r83 est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 271
    Points : 86
    Points
    86
    Par défaut
    Bonjour,

    Effectivement, ce n'est pas simple.... Je vais étudier le code.
    Je te remercie pour cette réponse fort complète.
    Bonne journée

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 345
    Points : 496
    Points
    496
    Par défaut
    Citation Envoyé par r83 Voir le message
    Bonjour,

    Effectivement, ce n'est pas simple.... Je vais étudier le code.
    Je te remercie pour cette réponse fort complète.
    Bonne journée
    Nan mais au final c'est super simple, tu utilises ma fonction qui transforme un XML en objet, et tu utilises l'exemple que je t'ai donné pour transformer ton XML en JS puis pour le lire.

    Tu as juste à copier-coller et c'est torché pour toi.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 426
    Points : 183
    Points
    183
    Par défaut
    Bonjour,

    Avec la librairie JQUERY, ça sera plus simple

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 345
    Points : 496
    Points
    496
    Par défaut
    Citation Envoyé par jaljal Voir le message
    Bonjour,

    Avec la librairie JQUERY, ça sera plus simple
    Ta réponse est un peu trop facile là, et j'aimerai bien voir comment

    Et surtout utiliser une enclume pour écraser un moucheron

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 426
    Points : 183
    Points
    183
    Par défaut
    Avec Jquery, pour charger un fichier XML , on écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $(document).ready(function() {
     
    $.get('d.xml', function(data) { 
     
    //Le traitement voulu ici 
    });
     
    });
    Pour chercher la valeur d'une balise 'entry', on écrit

    VOILA

  8. #8
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par r83
    m'aider à optimiser ce code.
    Citation Envoyé par jaljal
    Avec la librairie JQUERY, ça sera plus simple
    Je vois mal en quoi rajouter un traitement jQuery peut être considéré comme une optimisation...

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut super!!!!
    Bonjour,

    xml2obj est super!!!

    cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#][XML] parcours XML débutant
    Par loic_86 dans le forum C#
    Réponses: 5
    Dernier message: 03/04/2011, 12h46
  2. Parcours XML recursif
    Par gostbuster dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/08/2009, 16h48
  3. [DOM] Parcours XML
    Par speedev dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/11/2007, 12h16
  4. actionScript classe parcours XML
    Par LeXo dans le forum Flash
    Réponses: 2
    Dernier message: 26/06/2007, 16h06
  5. Parcours xml
    Par jeff_! dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 30/11/2005, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo