Parser un xml

Résolu
cs_zeitoun69 Messages postés 23 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 29 août 2010 - 21 août 2010 à 12:05
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 - 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

17 réponses

PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
28 août 2010 à 16:42
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)
3
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
24 août 2010 à 16:15
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)
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
24 août 2010 à 16:18
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)
0
cs_zeitoun69 Messages postés 23 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 29 août 2010
24 août 2010 à 19:50
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
25 août 2010 à 09:20
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)
0
cs_zeitoun69 Messages postés 23 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 29 août 2010
25 août 2010 à 09:48
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
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
25 août 2010 à 10:01
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)
0
cs_zeitoun69 Messages postés 23 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 29 août 2010
25 août 2010 à 19:13
Je n'ai pas le choix de la forme du fichier XML, je dois faire avec...


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

Zeitoun
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
26 août 2010 à 13:09
tout dépend de ce que tu veux faire avec les données recueillies et le traitement à appliquer dessus.
;O)
0
cs_zeitoun69 Messages postés 23 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 29 août 2010
26 août 2010 à 20:19
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
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
27 août 2010 à 07:50
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)
0
cs_zeitoun69 Messages postés 23 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 29 août 2010
28 août 2010 à 14:34
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
0
cs_zeitoun69 Messages postés 23 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 29 août 2010
29 août 2010 à 12:19
Merci beaucoup pour ton aide j'y suis arrivé enfin ;-)

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