Parser un xml [Résolu]

cs_zeitoun69 23 Messages postés vendredi 31 décembre 2004Date d'inscription 29 août 2010 Dernière intervention - 21 août 2010 à 12:05 - Dernière réponse : PetoleTeam 3435 Messages postés lundi 26 décembre 2005Date d'inscription 14 janvier 2011 Dernière intervention
- 31 août 2010 à 15:37
Bonjour je dois parser un fichier xml et former un tableau a partir des données extraite
j'ai réussi a former le tableau mais les données sont celles de la premiere ligne, voici mon code, je suis débutant soiyez ingulgent sur la propreté ..

// début du code
function submitForm() {
var xhr_object = null;

if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}

xhr_object.open("GET", "dispoMAJ-2010.xml", true);

/*
//0 ou un nombre supérieur à 0
*/

xhr_object.onreadystatechange = function() {
if(xhr_object.readyState == 4) {
var xml =xhr_object.responseXML;
var racine = xml.documentElement;

var result="";
document.write( "<table width='100%' border='1'> <tr> <td></td>" );
// on teste d'abord le nmbre de jours présents dans la base
for(var i = 0; i<racine.childNodes.length; i++){
if (xml.getElementsByTagName("MAJDispo")[i])
document.write("<td width ='200'>"+xml.getElementsByTagName("MAJDispo")[i].getAttribute("date")+"</td>");
}
document.write( "</tr> <tr> " );
getFils(racine);
document.write( "</tr><table>" );
}



function getFils(xml){
if (xml.nodeName =="CompteDispo")
{
for(var i = 0; i<xml.childNodes.length; i++){
var element = xml.childNodes[i];
// On affiche le nom des appartements
document.write( "<td> "+element.nodeValue+" </td>" );
}
for(var k = 0; k<racine.childNodes.length; k++){
// for(var i = 0; i<xml.childNodes.length; i++){
//s'il existe une date alors on affiche la dispo
if (racine.getElementsByTagName("MAJDispo")[k])
document.write("<td>"+racine.getElementsByTagName("MAJDispo")[k].getElementsByTagName("CompteDispo")[i].getAttribute("Nb_loge")+"</td>");
//}
}
}


for(var i = 1; i<xml.childNodes.length; i++){
var element = xml.childNodes[i];
var nom = element.nodeName;
if(element.nodeType==1)
{document.write( "<tr>" );
getFils(element);
document.write( "</tr>" );}


}
}


}

xhr_object.send(null);

}
/*fin du code*/




le fichier XML est de la forme de
<?xml version="1.0" encoding="UTF-8"?>
<donnees>
<MAJDispo date="2010-12-01">
<Dispo>
<CompteDispo Nb_loge="1">element1</CompteDispo>
<CompteDispo Nb_loge="0">element2</CompteDispo>
<CompteDispo Nb_loge="1">element3</CompteDispo>
</dispo>
</MAJDispo>
<MAJDispo date="2010-12-02">
<Dispo>
<CompteDispo Nb_loge="0">element1</CompteDispo>
<CompteDispo Nb_loge="0">element2</CompteDispo>
<CompteDispo Nb_loge="1">element3</CompteDispo>
</dispo>
</MAJDispo>
</donnees>
Zeitoun
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
PetoleTeam 3435 Messages postés lundi 26 décembre 2005Date d'inscription 14 janvier 2011 Dernière intervention - 28 août 2010 à 16:42
3
Merci
Bonjour,
j'ai réussi à écrire mais le code ne renvoie pas le tableau de données
effectivement pas dans le code que tu montres, il n'y a pas de mise de données dans ce tableau dans la boucle
//-- Parcours NodeList balises CompteDispo      
for (var j 0, nb_j T_Compte.length; j < nb_j; j++) {
  //-- balise en cours
  var O_Compte = T_Compte[j];
  //-- Recup Info
  var szNomLogement = O_Compte.childNodes[0].nodeValue;
  var szNbrLogement = O_Compte.getAttribute("Nb_loge");
  T_Result[szNbrLogement] = new Array();
  Html += "<tr>";
  Html += "<td>" + szNomLogement + "<\/b> <\/td>";
  for (var i 0, nb_i T_Maj.length; i < nb_i; i++) {
    Html += "<td>" + T_Result[szNbrLogement] + "<\/td>";
  }
  Html += "<\/tr>";
} //-- fin Parcours NodeList balises CompteDispo
ou est ce que les données sont mise dans le tableau ????

Remarques
- tu utilises 2 fois la variables i dans tes boucles => DANGER
- où tu écris dans la variable Html ou tu traites en suite après avoir mis les données dans les tableaux
- si tu exploites les tableaux via d'autres fonctions, mise en forme par exemple, penses bien à les mettre en variables globales

exemple de mise en place des données
for (var j 0, nb_j T_Compte.length; j < nb_j; j++) {
  //-- balise en cours
  var O_Compte = T_Compte[j];
  //-- Recup Info
  var szNomLogement = O_Compte.childNodes[0].nodeValue;
  var szNbrLogement = O_Compte.getAttribute("Nb_loge");
  //-- Get les data
  if (!T_Result[szNomLogement]) {
    //-- Creation entree
    T_Result[szNomLogement] = new Array();
  }
  //-- Ajout nouvel attribut
  T_Result[szNomLogement].push({
    date: szDate,
    actif: szNbrLogement
  });
  T_Date[szDate].push({
    nom: szNomLogement,
    actif: szNbrLogement
  });
}

Nota : on utilise la méthode push car les tableaux associatifs non pas de propriété length

et voici une façon de parcourir ces mêmes tableaux
Html  = "";
for (var i in T_Result) {
  Html += i;
  for (var k in T_Result[i]) {
    Html += ' date  -> ' + T_Result[i][k].date;
    Html += ' actif -> ' + T_Result[i][k].actif;
  }
  Html += '
';
}

for (var i in T_Date) {
  Html += i;
  for (var k in T_Date[i]) {
    Html += ' nom  -> ' + T_Date[i][k].nom;
    Html += ' actif -> ' + T_Date[i][k].actif;
  }
  Html += '
';
}

à toi de voir comment tu peux utiliser cela en fonction de tes propres besoins

;O)

Merci PetoleTeam 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de PetoleTeam
PetoleTeam 3435 Messages postés lundi 26 décembre 2005Date d'inscription 14 janvier 2011 Dernière intervention - 24 août 2010 à 16:15
0
Merci
Bonjour,
tout d'abord il est à signaler que document.write() remplace le contenu du document, donc à éviter dans ton cas.

Pour ce qui est de lire ton fichier XML il est souhaitable d'imbriquer tes boucles

Dans le principe cela donnerait un truc ressemblant à cela, à toi d'affiner pour que cela colle à ton besoin
//-- La chaine a ecrire dans une DIV par exemple
var Html = "";
Html += "<table>";
//-- Recup Objet au format DOM
var O_Xml = xhr_object.responseXML
//-- Recup NodeList balises MAJDispo
var T_Maj = O_Xml.getElementsByTagName("MAJDispo");
//-- Parcours NodeList balises MAJDispo
for( var i 0, nb_i T_Maj.length; i < nb_i; i++){
  //-- balise en cours
  var O_Maj = T_Maj[i];
  //-- recup de la date
  var szDate = O_Maj.getAttribute("date");
  //-- Ecriture nouvelle ligne  
  Html += "<tr><td>" + szDate +"<\/td><\/tr>;
  //-- Recup NodeList balises Dispo
  var T_Dispo = O_Maj.getElementsByTagName("Dispo");
  //-- Parcours NodeList balises MAJDispo  
  for( var k 0, nb_k T_Dispo.length; k < nb_k; k++){
    //-- balise en cours
    var O_Dispo = T_Dispo[k];
    //-- Recup NodeList balises CompteDispo
    var T_Compte = O_Dispo.getElementsByTagName("CompteDispo");
    //-- Parcours NodeList balises CompteDispo      
    for( var j 0, nb_j T_Compte.length; j < nb_j; j++){
      //-- balise en cours
      var O_Compte = T_Compte[j];
      //-- Recup Info
      var szNomLogement = O_Compte..childNodes[0].nodeValue;
      var szNbrLogement = O_Compte.getAttribute("Nb_loge"); 
    }    
  }  
}  
Html += "<\/table>";

il ne te restera plus qu'à mettre le Html au bon endroit.
;O)
Commenter la réponse de PetoleTeam
PetoleTeam 3435 Messages postés lundi 26 décembre 2005Date d'inscription 14 janvier 2011 Dernière intervention - 24 août 2010 à 16:18
0
Merci
j'ai oublié de mettre la phrase qui tue
Pas testé donc gare aux fôtes de frappe et autres

sur cette ligne par exemple il y a un point en trop...
var szNomLogement = O_Compte..childNodes[0].nodeValue;

;O)
Commenter la réponse de PetoleTeam
cs_zeitoun69 23 Messages postés vendredi 31 décembre 2004Date d'inscription 29 août 2010 Dernière intervention - 24 août 2010 à 19:50
0
Merci
Bonjour
et merci pour ton coup de pouce
pour le document.write() je l'utilisais simplement pour tester mon code

concernant ta proposition j'ai un souci car firebug me retourne une erreur sur la ligne
var T_Maj = O_Xml.getElementsByTagName("MAJDispo");
l'erreur est "O_Xml is null"
d'ou peut venir le probleme ?
SI tu as une idée merci d'avance
pour info j'ai placé le code suivant avant le tien

var xhr_object = null; 
 
if(window.XMLHttpRequest) // Firefox 
   xhr_object = new XMLHttpRequest(); 
else if(window.ActiveXObject) // Internet Explorer 
   xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); 
else { // XMLHttpRequest non supporté par le navigateur 
   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");  
} 
 
xhr_object.open("GET", "dispoMAJ-2010.xml", true); 

Merci

Zeitoun
Commenter la réponse de cs_zeitoun69
PetoleTeam 3435 Messages postés lundi 26 décembre 2005Date d'inscription 14 janvier 2011 Dernière intervention - 25 août 2010 à 09:20
0
Merci
Bonjour,
à priori pas de raison qu'il soit null, c'est le même que celui que tu as déclaré dans ta fonction
xhr_object.onreadystatechange = function() {
  if( xhr_object.readyState == 4) {
  var xml = xhr_object.responseXML; 
juste avec un nom différent donc
xhr_object.onreadystatechange = function() {
  if( xhr_object.readyState == 4) {
  var O_Xml = xhr_object.responseXML; // ICI O_Xml
je rajouterais simplement
xhr_object.onreadystatechange = function() {
  //-- Termine, les donnees sont chargees
  if( xhr_object.readyState == 4){
    //-- Reponse OK
    if(( xhr_object.status 0)||( xhr_object.status 200)){
      var O_Xml = xhr_object.responseXML; 
      //-- ton code ICI --//
    }
  }
}

;O)
Commenter la réponse de PetoleTeam
cs_zeitoun69 23 Messages postés vendredi 31 décembre 2004Date d'inscription 29 août 2010 Dernière intervention - 25 août 2010 à 09:48
0
Merci
Merci
l'erreur venait d'ailleurs à priori mais ca fonctionne à présent
la difficulté que je rencontre est de devoir faire la liste de tous les attributs pour chaque élément de facon à avoir
élément 1 : 1,0,1,1,0,0...
élément 2 : 0,0,0,1,1,0....
Merci d'avance

Zeitoun
Commenter la réponse de cs_zeitoun69
PetoleTeam 3435 Messages postés lundi 26 décembre 2005Date d'inscription 14 janvier 2011 Dernière intervention - 25 août 2010 à 10:01
0
Merci
dans ce cas il te faut peut être revoir la structure de ton fichier XML, ou de mettre tes données dans un tableau associatif et de traiter celui ci...

;O)
Commenter la réponse de PetoleTeam
cs_zeitoun69 23 Messages postés vendredi 31 décembre 2004Date d'inscription 29 août 2010 Dernière intervention - 25 août 2010 à 19:13
0
Merci
Je n'ai pas le choix de la forme du fichier XML, je dois faire avec...


Zeitoun
Commenter la réponse de cs_zeitoun69
PetoleTeam 3435 Messages postés lundi 26 décembre 2005Date d'inscription 14 janvier 2011 Dernière intervention - 26 août 2010 à 08:11
0
Merci
Bonjour,
Je n'ai pas le choix de la forme du fichier XML, je dois faire avec...
donc tableau associatif...
;O)
Commenter la réponse de PetoleTeam
PetoleTeam 3435 Messages postés lundi 26 décembre 2005Date d'inscription 14 janvier 2011 Dernière intervention - 26 août 2010 à 08:14
0
Merci
j'oubliais, voir du coté du format JSON éventuellement...
;O)
Commenter la réponse de PetoleTeam
cs_zeitoun69 23 Messages postés vendredi 31 décembre 2004Date d'inscription 29 août 2010 Dernière intervention - 26 août 2010 à 08:50
0
Merci
Merci pour ces infos je vais m'y pencher, j'avoue galérer un peu sur le format de ce xml ;-)

Zeitoun
Commenter la réponse de cs_zeitoun69
PetoleTeam 3435 Messages postés lundi 26 décembre 2005Date d'inscription 14 janvier 2011 Dernière intervention - 26 août 2010 à 13:09
0
Merci
tout dépend de ce que tu veux faire avec les données recueillies et le traitement à appliquer dessus.
;O)
Commenter la réponse de PetoleTeam
cs_zeitoun69 23 Messages postés vendredi 31 décembre 2004Date d'inscription 29 août 2010 Dernière intervention - 26 août 2010 à 20:19
0
Merci
J'ai deux besoins : pour un élément faire la liste des attributs pour toutes les dates disponibles
et pour une période faire ressortir les éléments qui ont un attribut nul ..


Zeitoun
Commenter la réponse de cs_zeitoun69
PetoleTeam 3435 Messages postés lundi 26 décembre 2005Date d'inscription 14 janvier 2011 Dernière intervention - 27 août 2010 à 07:50
0
Merci
Bonjour,
c'est donc au plus profond de tes boucles que tu peux récupérer les données et les mettre en tableau par exemple:
//-- Init des tableaux de recup
var T_Elem = new Array(); // pour les traitement sur les elements
var T_Date = new Array(); // pour les traitement sur les dates
avec dans la boucle de lecture des MAJDispo et après avoir récupéreé la date...
//-- Init tableau de tableau sur la date
T_Date[szDate] = new Array();
et dans la boucle lecture des CompteDispo et après avoir récupérer le nom de l'élément...
if( !T_Result[szNomLogement]){
  //-- Creation entree
  T_Result[szNomLogement] = new Array();
}
il ne te reste plus qu'à mettre dedans ce qui t'intéresses pour traitement.

Nota :
Si tu réalises les traitement en dehors de la fonction penses à mettre la déclaration des tableaux en global pour pouvoir y accéder dans les autres fonctions de ton code.

;O)
Commenter la réponse de PetoleTeam
cs_zeitoun69 23 Messages postés vendredi 31 décembre 2004Date d'inscription 29 août 2010 Dernière intervention - 28 août 2010 à 14:34
0
Merci
Bonjour
j'avoue ne pas réussir a faire ressortir les donnees voici ce que j'ai réussi à écrire mais le code ne renvoie pas le tableau de données
pouvez vous m'aiguiller sur la solution ?
function listedate() {
var xhr_object = null; 

//-- Init des tableaux de recup
var T_Result = new Array(); // pour les traitement sur les elements
var T_Date = new Array(); // pour les traitement sur les dates

 
if(window.XMLHttpRequest) // Firefox 
   xhr_object = new XMLHttpRequest(); 
else if(window.ActiveXObject) // Internet Explorer 
   xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); 
else { // XMLHttpRequest non supporté par le navigateur 
   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
   return; 
} 
 
xhr_object.open("GET", "dispoMAJ.xml", true); 

 
xhr_object.onreadystatechange = function() { 
   if(xhr_object.readyState == 4) { 
  

var Html = "";
Html += "<table>";

 //-- Recup Objet au format DOM
var O_Xml = xhr_object.responseXML; 
var racine = O_Xml.documentElement;

//-- Recup NodeList balises MAJDispo

var T_Maj  = racine.getElementsByTagName("MAJDispo");
Html += "<table width='100%' border='1'> <tr> <td>essai<\/td>";

//-- Parcours NodeList balises MAJDispo
for( var i 0, nb_i T_Maj.length; i < nb_i; i++){
  //-- balise en cours
  var O_Maj = T_Maj[i];
  //-- recup de la date
  var szDate = O_Maj.getAttribute("date");
//-- Init tableau de tableau sur la date
T_Date[szDate] = new Array();
  //-- Ecriture nouvelle ligne  
  Html += "<td>" + szDate +"<\/td>";
}  
  //-- Recup NodeList balises Dispo
  var T_Dispo = O_Maj.getElementsByTagName("Dispo");
  //-- Parcours NodeList balises MAJDispo  
  for( var k 0, nb_k T_Dispo.length; k < nb_k; k++){
    //-- balise en cours
    var O_Dispo = T_Dispo[k];
    //-- Recup NodeList balises CompteDispo
    var T_Compte = O_Dispo.getElementsByTagName("CompteDispo");
    //-- Parcours NodeList balises CompteDispo      
    for( var j 0, nb_j T_Compte.length; j < nb_j; j++){
      //-- balise en cours
      var O_Compte = T_Compte[j];
      //-- Recup Info
      var szNomLogement = O_Compte.childNodes[0].nodeValue;
      var szNbrLogement = O_Compte.getAttribute("Nb_loge");
T_Result[szNbrLogement] = new Array();
 Html += "<tr>" ;
 Html += "<td>"+szNomLogement+"<\/b> <\/td>" ;
for (var i 0, nb_i T_Maj.length; i < nb_i; i++)
 {
 Html += "<td>"+T_Result[szNbrLogement] + "<\/td>" ;
  }
 Html += "<\/tr>"; 
//-- fin Parcours NodeList balises CompteDispo	 
} 
//-- fin Parcours NodeList balises MAJDispo	
  }  
Html += "<\/table>";
document.getElementById('listedispo').innerHTML = Html;

//fin if state4
  } 
  //fin function()
  }
xhr_object.send(null); 
//fin function liste date
}

Merci d'avance
Zeitoun
Commenter la réponse de cs_zeitoun69
cs_zeitoun69 23 Messages postés vendredi 31 décembre 2004Date d'inscription 29 août 2010 Dernière intervention - 29 août 2010 à 12:19
0
Merci
Merci beaucoup pour ton aide j'y suis arrivé enfin ;-)

Zeitoun
Commenter la réponse de cs_zeitoun69
PetoleTeam 3435 Messages postés lundi 26 décembre 2005Date d'inscription 14 janvier 2011 Dernière intervention - 31 août 2010 à 15:37
0
Merci
Bonjour,
Merci beaucoup pour ton aide j'y suis arrivé enfin ;-)
de rien c'est le but, entres autres, des forums.
Bonne continuation.
;O)
Commenter la réponse de PetoleTeam

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.