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 :

noeud xml et javascript


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut noeud xml et javascript
    Bonjour a tous,
    Ce sujet a déjà été traité de nombreuse fois dans les forums mais je ne trouve pas de réponse à mon problème, j'ai le shéma XML suivant :
    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
     
    <plan>
    <Ligne>
    	<Champs1>V1</Champs1>
    	<Champs2>V2</Champs2>
    	<Champs3>V3</Champs3>
    	<Champs4>
    		<C1>s1</C1>
    		<C2>s1</C2>
    		<C3>s1</C3>
    	</Champs4>	
    </Ligne>
    <Ligne>
    	<Champs1>V1</Champs1>
    	<Champs2>V2</Champs2>
    	<Champs3>V3</Champs3>
    	<Champs4>
    		<C1>s1</C1>
    		<C2>s1</C2>
    		<C3>s1</C3>
    	</Champs4>	
    </Ligne>
    </plan>
    Je l'exploite avec le code Javascript suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var lePlan = docXML.getElementsByTagName("plan");
    var nombre = lePlan[0].childNodes.length;
    for (var i=0;i<nombre+1;i++)
    {
    	var Champs1=lePlan[0].getElementsByTagName("Champs1")[i].firstChild.nodeValue;
    	var Champs2=lePlan[0].getElementsByTagName("Champs2")[i].firstChild.nodeValue;
    	var Champs3=lePlan[0].getElementsByTagName("Champs3")[i].firstChild.nodeValue;
     
    }
    Je voudrais maintenant faire pareil pour les champs C1, C2 et C3 mais je n'arrive pas a obtenir la taille de Champs4, j'ai éssayé de procédé comme pour le champs plan ou les autres champs mais sa me renvois de mauvais résultat ou des erreurs.
    Je ne suis pas un expert en XML, si quelqu'un a une idée merci d'avance pour votre aide.

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 105
    Points : 119
    Points
    119
    Par défaut
    Bonjour,

    Quel est ton but exactement, lire tous les champs du XML ?

    Je ne vois pas ou tu bloques, il nous manque des elements je pense.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    Mon but est de lire les valeur de c1, c2 et c3 (et accéssoirement leurs attribut); je ne trouve pas les fonction pour me déplacer correctement dans le XML.
    J'ai réussi a obtenir Champs1, Champs2 et Champs3 grâce aux tutoriel mais je ne trouve pas comment aller plus loin, je n'obtient que des erreurs ou des incohérence (j'arrive à obtenir le premier Champs4 mais pas les suivant).
    J'éspère avoir été claire, Merci d'avance pour votre aide.

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 105
    Points : 119
    Points
    119
    Par défaut
    Je vois, je t'ai fait un code simple pour illustrer la récursivité dans la lecture d'un fichier XML :

    Le code permet de lire un fichier xml, de recuperer toutes les données et de les afficher.
    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
     
    var file = "file.xml";
    // methode perso pour ouvrir un xml, data etant le document xml
    $.readXML(file, function(data){
     
            var result = "";
     	result = read(null, data, 0, result);
    	document.write(result);
     
    	/**
    	 *  Permet de lire recursivement le fichier xml
    	 *  et l'affiche
    	 *  @param  DomNode parent  	noeud qui possede des fils
    	 *  @param  DomDocument file    document XML
    	 *  @param  Int spaces          nombre d'espace indiquant le niveau
    	 *  @param  String result       Stocke les donnees a afficher
    	 *  @return String              Retourne la chaine contenant les données
    	 */
    	function read(parent, file, spaces, result)
    	{
    	var xml = null;
    	if(parent == null)
    	    xml = file;
    	else
    	    xml = parent;
     
    	var children = xml.childNodes;
    	for(child in children)
    	{
    	    var e = children[child];
    	    if(e.nodeType == 1)
    	    {
    			if(e.children.length > 0)
    			{
    			    var nspaces = "";
    			    for(var i = 0; i < spaces; i++)
    			        nspaces += "&nbsp;&nbsp;&nbsp;";
     
    			    result += "<br/>" + nspaces + "- " + e.nodeName + ": ";
    			    result = read(e, null, spaces + 1, result);
    			}
    			else
    			{
    			    var nspaces = "";
    			    for(var i = 0; i < spaces; i++)
    			        nspaces += "&nbsp;&nbsp;&nbsp;&nbsp;";
     
    			    result += "<br/>" + nspaces + e.nodeName + ": " + e.firstChild.nodeValue;
    			}
    	    }
    	}
     
    	return result;
    	}
    });
    Ce qui affiche:
    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
     
    - plan:
       - Ligne:
            Champs1: V1
            Champs2: V2
            Champs3: V3
          - Champs4:
                C1: s1
                C2: s1
                C3: s1
       - Ligne:
            Champs1: V1
            Champs2: V2
            Champs3: V3
          - Champs4:
                C1: s1
                C2: s1
                C3: s1
    Dans ton cas tu peux créer un tableau ou un objet qui permettrait de stocker la hiérarchie de tes données.
    De même, tu peux changer certains paramètres, ne transmettre uniquement la partie que tu souhaites, par exemple Champs4[0] ou Champs4[1].

    J'espère que ce bout de code pourra t'aider dans ton problème.
    N'hésite pas si tu n'y arrive toujours pas ou autre.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    Merci beaucoup pour ta réponse,
    Ma fonction n'est pas en récursive, j'ai essayé de l'adapté mais j'ai encore des erreurs:
    voila comment je procède:
    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
     
    var docXML= xhr.responseXML;
    var lePlan = docXML.getElementsByTagName("Pla");
    var nombre = lePlan[0].childNodes.length;
    for (var i=0;i<nombre+1;i++)
    {
    	var Prio=lePlan[0].getElementsByTagName("Champs1")[i].firstChild.nodeValue;
    	var Line=lePlan[0].getElementsByTagName("Champs2")[i].firstChild.nodeValue;
    	var Process=lePlan[0].getElementsByTagName("Champs3")[i].firstChild.nodeValue;
    	//La récupération de ces 3 champs fonctionne très bien
     
    	var ListeChamps;
    	var MesChamps = lePlan[0].childNodes("Ligne")[i].childNodes("Champs4")[0];
    	var nombreChamps4 = MesChamps.childNodes.length;
    	for (var j=1;j<nombreChamps4 +1;j++){						
    			var selection=MesChamps[0].getElementsByTagName("C"+j)[0].attributes.getNamedItem("select").value;
    		if(selection=="selected"){
    			ListeChamps=ListeChamps+'<option value="'+MesChamps[0].getElementsByTagName("C"+j)[0].firstChild.nodeValue+'" selected="selected">'+MesChamps[0].getElementsByTagName("C"+j)[0].firstChild.nodeValue+'</option>';
    		}
    		else{
    			ListeChamps=ListeChamps+'<option value="'+MesChamps[0].getElementsByTagName("C"+j)[0].firstChild.nodeValue+'">'+MesChamps[0].getElementsByTagName("C"+j)[0].firstChild.nodeValue+'</option>';
    		}								
    	}
    }
    cette méthode me renvoit une erreur,
    j'ai essayé autrement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var ListeChamps;
    var MesChamps = lePlan[0].getElementsByTagName("ListeChamps");
    var nombreChamps4 = MesChamps[0].childNodes.length;
    for (var j=1;j<nombreChamps4+1;j++){
    	var selection=MesChamps[0].getElementsByTagName("C"+j)[0].attributes.getNamedItem("select").value;
    	if(selection=="selected"){
    		ListeChamps=ListeChamps+'<option value="'+MesChamps[0].getElementsByTagName("C"+j)[0].firstChild.nodeValue+'" selected="selected">'+MesChamps[0].getElementsByTagName("C"+j)[0].firstChild.nodeValue+'</option>';
    	}
    	else{
    		ListeChamps=ListeChamps+'<option value="'+MesChamps[0].getElementsByTagName("C"+j)[0].firstChild.nodeValue+'">'+MesChamps[0].getElementsByTagName("C"+j)[0].firstChild.nodeValue+'</option>';
    	}	
    }
    La deuxième solutiion ne renvoit que la première liste de champs4
    vois-tu où est le problème?
    Merci beauvoup pour ton aide.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 105
    Points : 119
    Points
    119
    Par défaut
    Eh bien a vu de pif comme ca, je pense que ca te retourne le deuxieme Champs4 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var j=1;j<nombreChamps4+1;j++
    L'indexion dans un tableau commence a 0 donc ce serait plus dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var j=0;j<nombreChamps4;j++
    Essaie voir!

    ps: c'est quoi ton getElementsByTagName("ListeChamps"); ? il n'etait pas dans le xml celui la!

    Edit: j'ai modifié ton premier code en suivant ta logique, je recupere ce qu'il faut:
    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
     
    var lePlan = data.getElementsByTagName("plan");
    for(var child in lePlan[0].childNodes)
    {
    	var e = lePlan[0].childNodes[child]
    	if(e.nodeType == 1)
    	{
    		var Prio = e.getElementsByTagName("Champs1")[0].firstChild.nodeValue;
    		var Line = e.getElementsByTagName("Champs2")[0].firstChild.nodeValue;
    		var Process = e.getElementsByTagName("Champs3")[0].firstChild.nodeValue;
    		//La récupération de ces 3 champs fonctionne très bien
     
    		var ListeChamps;
    		var MesChamps = e.getElementsByTagName("Champs4")[0];
     
    		for(var toto in MesChamps.childNodes)
    		{
    		    var ee = MesChamps.childNodes[toto];
    		    if(ee.nodeType == 1)
    			{
    		    	alert(ee.firstChild.nodeValue);
    		    }
    		}
    	}
    }
    - childNodes("quelquechose") n'existe pas, a moins de se fabriquer sa propre fonction.
    - teste toujours tes noeuds avec nodeType, car tu pourrais tres bien tomber sur un noeud #text au lieu d'un DomNode.
    - étudie bien comment parcourir un arbre DOM, tu fais des erreurs.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    Autant pour moi, ce n'est pas listeChamps, c'es:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getElementsByTagName("Champs4");
    J'ai essayé de remplacer avec les modif que tu m'as dit, sa me renvoit une erreur JS (object required).
    Aparement après de nouveau test, c'est bien la première liste qu'il me renvoi (en me basant sur la valeur des attribut select).

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 105
    Points : 119
    Points
    119
    Par défaut
    Regarde bien mon précédant message, j'ai pris ton premier code, tu n'as juste qu'a mettre ta generation de "select" et c'est bon.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    Merci beaucoup pour ton exemple, je comprend mieu le principe. je l'ai adapté a mon exemple mais il me renvoi encore une erreur
    en placant des alert cela arrive a la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (var child in lePlan[0].childNodes)
    Il ne rentre manifèstement pas dans la boucle.

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 105
    Points : 119
    Points
    119
    Par défaut
    heu c'est a la deuxieme ligne ca!
    As tu bien remplacé la variable data par docXML a la ligne
    var lePlan = data.getElementsByTagName("plan"); ?

    Sinon vérifie ce que tu as bien un docXML correcte

  11. #11
    Membre régulier
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 131
    Points : 72
    Points
    72
    Par défaut
    Bonjour aux intervenants,
    Comme je suis intéressé aussi par ce sujet (d'ailleurs j'ai un post en cours sur la question) je me permets d'intervenir pour poser une question

    Je voudrais savoir à quoi fait référence le début de ton code dans cette ligne $.readXML(file, function(data){.....

    Puis-je remplacer cela par un code traditionnel de chargement de data xml ?

    Crois tu que ton code puisse aussi traiter ce genre de data 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
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <!-- New document created with EditiX at Tue Apr 13 15:23:37 CEST 2010 -->
     
     
    <reseau id_reseau="123" lib_res="RESEAU 1" lib_aff="AVENIR" datedepart="17/03/2010" faces="135" pdv="8" pdvmu="0" facesmu="0" facesgf="135" vitri="0" colle="135" cons="7" couleur_marqueur="red" >
    	<commune id_commune="11111" lib_com="AAAAA" faces="3" pop_comm="5684" pourc="5%" km_comm="10">
    		<iris id_iris="aaa" nom_iris="IRISAAA" faces_iris="2" pop_iris="10000" km_iris="12" >
    			<magasin id_mag="123" adresse_mag="123 rue de la gare">
    				<panneau id_panneau="678910">
    					<adr1>RUE DE LA GARE</adr1>
    					<adr2>ANGLE RIE</adr2>
    					<km>13.4</km>
    					<format>400X300</format>
    					<ecl>NON</ecl>
    					<tri>NON</tri>
    					<lat>45.56</lat>
    					<lng>5.56</lng>
    				</panneau>
    				<panneau id_panneau="345678">
    					<adr1>RUE DE LA</adr1>
    					<adr2>RURRUR</adr2>
    					<km>13.4</km>
    					<format>400X300</format>
    					<ecl>NON</ecl>
    					<tri>NON</tri>
    					<lat>45</lat>
    					<lng>78</lng>
    				</panneau>			
    			</magasin>
    		</iris>
    		<iris id_iris="bbb" nom_iris="IRISBBB" faces_iris="1" pop_iris="10000" km_iris="19" >
    			<magasin>
    				<panneau id_panneau="678911">
    					<adr1>RUE DE LA GARE</adr1>
    					<adr2>ANGLE RIE</adr2>
    					<km>13.4</km>
    					<format>400X300</format>
    					<ecl>NON</ecl>
    					<tri>NON</tri>
    					<lat>45.56</lat>
    					<lng>5.56</lng>
    				</panneau>				
    			</magasin>
    		</iris>
    	</commune>	
    	<commune id_commune="33333" lib_com="CCCCC"  faces="1" pop_comm="5684" pourc="8%" km_comm="10">
    		<iris id_iris="ccc" nom_iris="IRISCCC" faces_iris="1" pop_iris="10000" km_iris="12" >
    			<magasin id_mag="123" adresse_mag="123 rue de la gare">
    				<panneau id_panneau="565412">			
    					<adr1>RUE</adr1>
    					<adr2>RURURURURUR</adr2>
    					<km>13.4</km>
    					<format>400X300</format>
    					<ecl>NON</ecl>
    					<tri>NON</tri>
    					<lat>12</lat>
    					<lng>48</lng>
    				</panneau>
    			</magasin>
    		</iris>	
    	</commune>	
    </reseau>
    afin d'obtenir quelque chose de ressemblant à cela (voir la pièce jointe)

    D'avance merci
    ps : je remets l'url de mon premier post à ce sujet :
    http://www.developpez.net/forums/d90...ion-recursive/

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 105
    Points : 119
    Points
    119
    Par défaut
    Salut,

    Je voudrais savoir à quoi fait référence le début de ton code dans cette ligne $.readXML(file, function(data){.....
    C'est juste une fonction que j'ai faite dans framework js que j'ai commencé il y a peut etre 2 ans maintenant; elle permet de recuperer le DomDocument donc oui, tu peux remplacer celle ci par un chargement conventionnel.

    La fonction sert en gros d'exemple de parcours d'un fichier XML, tu peux l'utiliser pour ton affaire, il te faudra l'enrichir pour gerer les attributs de noeud, ce n'est pas tres compliqué, un coup de méthode "attributes" a un noeud, tu boucle dessus et tu les récupère un par un.
    Ensuite c'est juste une histoire de gestion des données récupérées pour ton affichage.

    Tu testes ca si tu veux et tu le rapporte sur ton topic, j'y jetterais un coup d'oeil en cas de pépin.

  13. #13
    Membre régulier
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 131
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par hakurou Voir le message
    Salut,


    C'est juste une fonction que j'ai faite dans framework js que j'ai commencé il y a peut etre 2 ans maintenant; elle permet de recuperer le DomDocument donc oui, tu peux remplacer celle ci par un chargement conventionnel.

    La fonction sert en gros d'exemple de parcours d'un fichier XML, tu peux l'utiliser pour ton affaire, il te faudra l'enrichir pour gerer les attributs de noeud, ce n'est pas tres compliqué, un coup de méthode "attributes" a un noeud, tu boucle dessus et tu les récupère un par un.
    Ensuite c'est juste une histoire de gestion des données récupérées pour ton affichage.

    Tu testes ca si tu veux et tu le rapporte sur ton topic, j'y jetterais un coup d'oeil en cas de pépin.
    Ok j'essaye de faire ça et te tiens au courant pour d'éventuelles questions
    Je te remercie pour ta réponse

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    Pour info, je n'ai toujours pas réussi a faire marché ton algo, j'ai réessayé avec un xml ultra-simplifié géneré via PHP:
    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
    <?xml version="1.0" ?> 
    - <lePlan>
    - <ligne>
      <Champs1>01</Champs1> 
      <Champs2>02</Champs2> 
      <Champs3>03</Champs3> 
    - <Champs4>
      <C1>041</C1> 
      <C2>042</C2> 
      <C3>043</C3> 
      </Champs4>
      </ligne>
    - <ligne>
      <Champs1>11</Champs1> 
      <Champs2>12</Champs2> 
      <Champs3>13</Champs3> 
    - <Champs4>
      <C1>141</C1> 
      <C2>142</C2> 
      <C3>143</C3> 
      </Champs4>
      </ligne>
    - <ligne>
      <Champs1>21</Champs1> 
      <Champs2>22</Champs2> 
      <Champs3>23</Champs3> 
    - <Champs4>
      <C1>241</C1> 
      <C2>242</C2> 
      <C3>243</C3> 
      </Champs4>
      </ligne>
    - <ligne>
      <Champs1>31</Champs1> 
      <Champs2>32</Champs2> 
      <Champs3>33</Champs3> 
    - <Champs4>
      <C1>341</C1> 
      <C2>342</C2> 
      <C3>343</C3> 
      </Champs4>
      </ligne>
    </lePlan>
    et j'ai quasiemet fait un copier coller de ton code:
    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
    <script type='text/javascript'>
    function parser()
    {
    	alert('toto');
    	var xhr=null;
    	if (window.XMLHttpRequest) { 
    		xhr = new XMLHttpRequest();
    	}
    	else if (window.ActiveXObject) { // IE
    		try {
    			xhr = new ActiveXObject("Msxml2.XMLHTTP");
    		} catch (e) {
    			try {
    				xhr = new ActiveXObject("Microsoft.XMLHTTP");
    			} catch (e) {}
    			}
    	}
    	//on définit l'appel de la fonction au retour serveur
    	//alert('toto1');
    	xhr.onreadystatechange = function() { alert_ajax(xhr); };
        xhr.open("POST", "essai.php5", true);
    	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    }
     
    function alert_ajax(xhr)
    {
    	var docXML= xhr.responseXML;
    	var lePlan = docXML.getElementsByTagName("lePlan");
    	for(var child in lePlan[0].childNodes)
    	{
    		alert('on rentre dans le for');
    		var e = lePlan[0].childNodes[child]
    		if(e.nodeType == 1)
    		{
    			var Prio = e.getElementsByTagName("Champs1")[0].firstChild.nodeValue;
    			var Line = e.getElementsByTagName("Champs2")[0].firstChild.nodeValue;
    			var Process = e.getElementsByTagName("Champs3")[0].firstChild.nodeValue;
    			//La récupération de ces 3 champs fonctionne très bien
    			var ListeChamps;
    			var MesChamps = e.getElementsByTagName("Champs4")[0];
    			for(var toto in MesChamps.childNodes)
    			{
    				var ee = MesChamps.childNodes[toto];
    				if(ee.nodeType == 1)
    				{
    					alert(ee.firstChild.nodeValue);
    				}
    			}
    		}	
    	}
    }
     
    </script>
    d'après les alarmes c'est belle et bien la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(var child in lePlan[0].childNodes)
    qui provoque une erreur (object required)

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 105
    Points : 119
    Points
    119
    Par défaut
    Je parie que tu n'as pas regardé ce que te retourne le docXML comme je te l'ai demandé, il te retourne un gros "null", simplement car tu n'as pas bien regardé les tutos sur Ajax proposés sur Developpez, si tu fais une requête en POST, il te faut "sender" des valeurs. en rajoutant xhr.send("") a la fin de ta premiere fonction ca fonctionne.

    Mais pour des raisons de logique, utile POST pour des envoies de données dites sensibles, de formulaire, et non de la recuperation d'XML. Pour ca tu peux utiliser un GET a la place.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    Si si j'ai bel et bien lu les tuto Ajax de devellopez et même d'autre effectivement je pensait quexhr.send n'etait pas indispensable si on n'envoyait pas de valeur. pour la verification j'ai rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function alert_ajax(xhr)
    {
    	var docXML= xhr.responseXML;
    	alert(docXML.nodeType);
    l'alert me renvoit 9 ce qui est le nombre de noeud du doc xml. Je ne pense donc pas qu'il renvoit un null.
    j'ai également rajouté un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    xhr.open("POST", "essai.php5", true);
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    xhr.send("");
    mais j'ai toujours une erreur au même niveau (la boucle for: object doesn't support this action).

  17. #17
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 105
    Points : 119
    Points
    119
    Par défaut
    Bon en recopiant ton code, en le modifiant a peine j'arrive encore a le faire fonctionner:
    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
     
     
    function parser()
    {
    	var xhr=null;
    	if (window.XMLHttpRequest) { 
    		xhr = new XMLHttpRequest();
    	}
    	else if (window.ActiveXObject) { // IE
    		try {
    			xhr = new ActiveXObject("Msxml2.XMLHTTP");
    		} catch (e) {
    			try {
    				xhr = new ActiveXObject("Microsoft.XMLHTTP");
    			} catch (e) {}
    			}
    	}
    	//on définit l'appel de la fonction au retour serveur
    	//alert('toto1');
            // NE PAS OUBLIER LES STATUS DE REPONSE DU SERVEUR
    	xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200){alert_ajax(xhr); }};
    	xhr.open("POST", "essai.php", true);
    	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhr.send("");
    }
     
    function alert_ajax(xhr)
    {	
    	var docXML= xhr.responseXML;alert(docXML);
    	var lePlan = docXML.getElementsByTagName("lePlan");alert(docXML);
    	for(var child in lePlan[0].childNodes)
    	{
    		alert('on rentre dans le for');
    		var e = lePlan[0].childNodes[child]
    		if(e.nodeType == 1)
    		{
    			var Prio = e.getElementsByTagName("Champs1")[0].firstChild.nodeValue;
    			var Line = e.getElementsByTagName("Champs2")[0].firstChild.nodeValue;
    			var Process = e.getElementsByTagName("Champs3")[0].firstChild.nodeValue;
    			//La récupération de ces 3 champs fonctionne très bien
    			var ListeChamps;
    			var MesChamps = e.getElementsByTagName("Champs4")[0];
    			for(var toto in MesChamps.childNodes)
    			{
    				var ee = MesChamps.childNodes[toto];
    				if(ee.nodeType == 1)
    				{
    					alert(ee.firstChild.nodeValue);
    				}
    			}
    		}	
    	}
    }
     
    parser();
    et le php, pour rester le plus proche de chez toi:
    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
     
    <?php
    header ("content-type: text/xml");
    echo '<?xml version="1.0" ?> 
     <lePlan>
     <ligne>
      <Champs1>01</Champs1> 
      <Champs2>02</Champs2> 
      <Champs3>03</Champs3> 
     <Champs4>
      <C1>041</C1> 
      <C2>042</C2> 
      <C3>043</C3> 
      </Champs4>
      </ligne>
     <ligne>
      <Champs1>11</Champs1> 
      <Champs2>12</Champs2> 
      <Champs3>13</Champs3> 
     <Champs4>
      <C1>141</C1> 
      <C2>142</C2> 
      <C3>143</C3> 
      </Champs4>
      </ligne>
     <ligne>
      <Champs1>21</Champs1> 
      <Champs2>22</Champs2> 
      <Champs3>23</Champs3> 
     <Champs4>
      <C1>241</C1> 
      <C2>242</C2> 
      <C3>243</C3> 
      </Champs4>
      </ligne>
     <ligne>
      <Champs1>31</Champs1> 
      <Champs2>32</Champs2> 
      <Champs3>33</Champs3> 
     <Champs4>
      <C1>341</C1> 
      <C2>342</C2> 
      <C3>343</C3> 
      </Champs4>
      </ligne>
    </lePlan>
     
    ';
    ?>
    Par contre, je viens de tester sur IE8 et effectivement je retrouve la même erreur que toi, et c'est tres bête car j'ai pour habitude de toujours faire des boucles for classique au lieu de for...in dans un parcours de DOM car ca peut produire des erreurs, eh bien ca se justifie, le nouveau code est donc (je voulais juste changer un peu )

    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
     
    function alert_ajax(xhr)
    {	
    	var docXML= xhr.responseXML;
    	var lePlan = docXML.getElementsByTagName("lePlan");
     
    	//for(var child in lePlan[0].childNodes;)
    	for(var i = 0; i < lePlan[0].childNodes.length; i++)
    	{
    		alert('on rentre dans le for');
    		//var e = lePlan[0].childNodes[child];
    		var e = lePlan[0].childNodes[i];
    		if(e.nodeType == 1)
    		{
    			var Prio = e.getElementsByTagName("Champs1")[0].firstChild.nodeValue;
    			var Line = e.getElementsByTagName("Champs2")[0].firstChild.nodeValue;
    			var Process = e.getElementsByTagName("Champs3")[0].firstChild.nodeValue;
    			//La récupération de ces 3 champs fonctionne très bien
    			var ListeChamps;
    			var MesChamps = e.getElementsByTagName("Champs4")[0];
    			for(var o = 0; o < MesChamps.childNodes.length; o++)
    			{
    				var ee = MesChamps.childNodes[o];
    				if(ee.nodeType == 1)
    				{
    					alert(ee.firstChild.nodeValue);
    				}
    			}
    		}	
    	}
    }
    Teste ca et donne un retour!

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    Merci beaucoup, ton deuxième code fonctionne et me renvoit exactement ce que je voulais. Je n'ai plus qu'a le modeler sur mon script initial. En tout cas merci du temps que tu m'a consacrer, sa m'a permis de mieu comprendre l'arboressence XML.
    encore merci et bonne journée a toi.

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

Discussions similaires

  1. Tester l'existence d'un noeud XML avec JavaScript
    Par molinadiaz dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/02/2012, 13h42
  2. Réponses: 10
    Dernier message: 17/02/2009, 18h57
  3. incrémenter valeur d'un noeud xml avec javascript
    Par caweb dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/01/2008, 09h52
  4. Réponses: 1
    Dernier message: 16/08/2007, 12h22
  5. XSL ne parvient pas à lire les noeuds XML ??
    Par yahn dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 27/06/2004, 19h29

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