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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 confirmé
    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
    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 confirmé
    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
    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 confirmé
    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
    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 confirmé
    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
    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 confirmé
    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
    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.

+ 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