Bonsoir,

Je afficher les données du fichier xml suivant:

<?xml version="1.0" encoding="utf-8"?>
<pma_xml_export version="1.0" xmlns:pma="http://www.phpmyadmin.net/some_doc_url/">
    <!--
    - Structure schemas
-->
<pma:structure_schemas>
    <pma:database name="makes_data" collation="latin1_swedish_ci" charset="latin1">
        <pma:table name="Sept2014">
            CREATE TABLE `Sept2014` (
            `Year` int(4) DEFAULT NULL,
            `Make` varchar(13) DEFAULT NULL,
            `Model` varchar(32) DEFAULT NULL,
            `Trim` varchar(73) DEFAULT NULL,
            `Engine Size` varchar(17) DEFAULT NULL,
            `Engine Cylinder` varchar(17) DEFAULT NULL,
            `Engine Compressor Type` varchar(21) DEFAULT NULL,
            `Transmission` varchar(17) DEFAULT NULL
            ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
        </pma:table>
    </pma:database>
</pma:structure_schemas>
    <!--
    - Database: 'makes_data'
-->
<database name="makes_data">
    <!-- Table Sept2014 -->
    <table name="Sept2014">
        <column name="Year">2001</column>
        <column name="Make">Acura</column>
        <column name="Model">RL</column>
        <column name="Trim">3.5 4dr Sedan</column>
        <column name="Engine Size">3.5L</column>
        <column name="Engine Cylinder">6cyl</column>
        <column name="Engine Compressor Type">dd</column>
        <column name="Transmission">AUTOMATIC</column>
    </table>
    <table name="Sept20141">
        <column name="Year">2001</column>
        <column name="Make">bmw</column>
        <column name="Model">RL</column>
        <column name="Trim">3.5 4dr Sedan </column>
        <column name="Engine Size">3.5L</column>
        <column name="Engine Cylinder">6cyl</column>
        <column name="Engine Compressor Type">dd</column>
        <column name="Transmission">AUTOMATIC</column>
    </table>
    <table name="Sept20142">
        <column name="Year">2004</column>
        <column name="Make">Acura</column>
        <column name="Model">RL</column>
        <column name="Trim">3.5 4dr Sedan</column>
        <column name="Engine Size">3.5L</column>
        <column name="Engine Cylinder">6cyl</column>
        <column name="Engine Compressor Type">dd</column>
        <column name="Transmission">AUTOMATIC</column>
    </table>
    <table name="Sept2014">
            <column name="Year">2009</column>
            <column name="Make">Mercedes-Benz</column>
            <column name="Model">E-Class</column>
            <column name="Trim">E550 4MATIC 4dr Sedan AWD</column>
            <column name="Engine Size">5.5L </column>
            <column name="Engine Cylinder">8cyl</column>
            <column name="Engine Compressor Type">dd</column>
            <column name="Transmission">AUTOMATIC</column>
        </table>
        <table name="Sept2014">
            <column name="Year">2005</column>
            <column name="Make">Mercedes-Benz</column>
            <column name="Model">E-Class</column>
            <column name="Trim">E550 4dr Sedan</column>
            <column name="Engine Size">5.5L </column>
            <column name="Engine Cylinder">8cyl</column>
            <column name="Engine Compressor Type">cc</column>
            <column name="Transmission">AUTOMATIC</column>
        </table>
        <table name="Sept2014">
            <column name="Year">2001</column>
            <column name="Make">Mercedes-Benz</column>
            <column name="Model">E-Class</column>
            <column name="Trim">E550 4dr Sedan</column>
            <column name="Engine Size">5.5L </column>
            <column name="Engine Cylinder">8cyl</column>
            <column name="Engine Compressor Type">cc</column>
            <column name="Transmission">AUTOMATIC</column>
        </table>
</database>
</pma_xml_export>

et ceci mon ficher html :

<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript">
       var xml;
        $(document).ready(function(){
            $.ajax({
                type: "GET",
                url: "tt.xml",
                dataType: "xml",
                success: xmlParser
            });
        }); 
        function xmlParser(data) {
            xml = data;
            $('#load').fadeOut();
            $(xml).find("column").each(function()
            {
              var $col = $(this); 
              var name = $col.attr("name");
              $("#list").append("<li>"+ $col.text() + "</li>");
            });
        }
    </script>
</head>
<body >
<ul id="list"></ul>
</body>
</html>

Il marche bien, mais pas comme je veux, par exemple je veux avoir tous les données des colonnes mais séparés par leur nom de category,

par exemple si je choisit l'annee 2001, je veux avoir les données du colonne name+make correspondant à cette année là, et lorsque je choisit make = Acura , Je vais avoir model et trim qui coorespond à ce make.

example: year = 2001 => make data retreived = { Acura, bmw, Mercedes-Benz}

if I choose make = Acure => Model data retreived = { RL } and Trim data retreived { 3.5 4dr Sedan}

Merci pour votre aide

14 réponses


antho07
Réponse acceptée

Re bonsoir, Comme convenu, Avec la librairie ancienne xml2json suivante: [code] Fichier xml2json /* This work is licensed under Creative Commons GNU LGPL License. License: http://creativecommons.org/licenses/LGPL/2.1/ Version: 0.9 Author: Stefan Goessner/2006 Web: http://goessner.net/ */ function xml2json(xml, tab) { var X = { toObj: function(xml) { var o = {}; if (xml.nodeType==1) { // element node .. if (xml.attributes.length) // element with attributes .. for (var i=0; i<xml.attributes.length i o if element has child nodes .. var textchild="0," cdatachild="0," haselementchild="false;" for n="xml.firstChild;" else n.nodevalue.match non-whitespace text cdata section node structured with evtl. a single or x.removewhite x.escape multiple occurence of instanceof array x.toobj first element.. mixed content pure> 1)
o = X.escape(X.innerXml(xml));
else
for (var n=xml.firstChild; n; n=n.nextSibling)
o["#cdata"] = X.escape(n.nodeValue);
}
}
if (!xml.attributes.length && !xml.firstChild) o = null;
}
else if (xml.nodeType==9) { // document.node
o = X.toObj(xml.documentElement);
}

     return o;
  },
  toJson: function(o, name, ind) {
     var json = name ? ("\""+name+"\"") : "";
     if (o instanceof Array) {
        for (var i=0,n=o.length; i<n i o x.tojson ind json> 1 ? ("\n"+ind+"\t"+o.join(",\n"+ind+"\t")+"\n"+ind) : o.join("")) + "]";
     }
     else if (o == null)
        json += (name&amp;&amp;":") + "null";
     else if (typeof(o) == "object") {
        var arr = [];
        for (var m in o)
           arr[arr.length] = X.toJson(o[m], m, ind+"\t");
        json += (name?":{":"{") + (arr.length &gt; 1 ? ("\n"+ind+"\t"+arr.join(",\n"+ind+"\t")+"\n"+ind) : arr.join("")) + "}";
     }
     else if (typeof(o) == "string")
        json += (name&amp;&amp;":") + "\"" + o.toString() + "\"";
     else
        json += (name&amp;&amp;":") + o.toString();
     return json;
  },
  innerXml: function(node) {
     var s = ""
     if ("innerHTML" in node)
        s = node.innerHTML;
     else {
        var asXml = function(n) {
           var s = "";
           if (n.nodeType == 1) {
              s += "";
                 for (var c=n.firstChild; c; c=c.nextSibling)
                    s += asXml(c);
                 s += ""+n.nodeName+"&gt;";
              }
              else
                 s += "/&gt;";
           }
           else if (n.nodeType == 3)
              s += n.nodeValue;
           else if (n.nodeType == 4)
              s += "";
           return s;
        };
        for (var c=node.firstChild; c; c=c.nextSibling)
           s += asXml(c);
     }
     return s;
  },
  escape: function(txt) {
     return txt.replace(/[\\]/g, "\\\\")
               .replace(/[\"]/g, '\\"')
               .replace(/[\n]/g, '\\n')
               .replace(/[\r]/g, '\\r');
  },
  removeWhite: function(e) {
     e.normalize();
     for (var n = e.firstChild; n; ) {
        if (n.nodeType == 3) { // text node
           if (!n.nodeValue.match(/[^ \f\n\r\t\v]/)) { // pure whitespace text node
              var nxt = n.nextSibling;
              e.removeChild(n);
              n = nxt;
           }
           else
              n = n.nextSibling;
        }
        else if (n.nodeType == 1) { // element node
           X.removeWhite(n);
           n = n.nextSibling;
        }
        else // any other node
           n = n.nextSibling;
     }
     return e;
  }

};
if (xml.nodeType == 9) // document node
xml = xml.documentElement;
var json = X.toJson(X.toObj(X.removeWhite(xml)), xml.nodeName, "\t");
return "{\n" + tab + (tab ? json.replace(/\t/g, tab) : json.replace(/\t|\n/g, "")) + "\n}";
}

[/code]

En appelant le fichier xml : test.xml , le code suivant semble correspondre à ton besoin (j'ai fait ça rapidement, à vérifier si pas de bug) :

[code]

<title>test</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">

<div>
<button id="afficheJSON"> Afficher/Masquer result json</button>
</div>
<div>
Year :<select data-numero="0" name="Year">

</select>
</div>
<div>
Make :<select disabled data-numero="1" name="Make"> </select>
</div>
<div>
Model :<select disabled data-numero="2" name="Model"> </select>
</div>
<div>
Trim :<select disabled data-numero="3" name="Trim"> </select>
</div>
<div>
val : <span id="result"></span>
</div>
<div>
<button id="reset">reset</button>
</div>
<div>
<pre></pre>
</div>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="xml2json.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var dataXml = null;
var isAffiche = false;
var valSelect = {};

$.get('test.xml',function(data){
var stringJSON = JSON.parse(xml2json(data,""));
dataXml = stringJSON["pma_xml_export"]["database"];
appendTabToSelect(getPropertiesWithConditions('Year'),0);
afficheResultat();
});

$("#afficheJSON").click(function(){
if(isAffiche){
$('pre').empty();
}else{
$('pre').html(JSON.stringify(dataXml,undefined, 8));
}
isAffiche = !isAffiche;

});

$('#reset').click(function(){
appendTabToSelect(getPropertiesWithConditions('Year'),0);
valSelect = {};
afficheResultat();

});

$('select').on('change',function(e){
if(this.value != ""){

 var nextNumero = parseInt(this.dataset.numero)+1;
 var $next = $('select[data-numero="'+nextNumero+'"]');
 for(i=0;i<nextNumero;i++){
 var el = $('select[data-numero="'+i+'"]')[0];
 valSelect = {};
 valSelect[el.name]=el.value;
 }

 if($next != null && $next.length == 1){
 appendTabToSelect(getPropertiesWithConditions($next[0].name,valSelect),nextNumero);
 }
   afficheResultat(); 

}

});

/*

  • conditions = {attributeName:value}; => exemple : {Year:2004,Make:"Acura"}
  • prop : "Year","Trim"
    /
    var getPropertiesWithConditions = function(prop,conditions){
    if(conditions == null){
    conditions = {};
    }
    var result = [];
    if(dataXml != null && dataXml.table != null && dataXml.table.length >0){
    for(var i=0;i<dataXml.table.length;i++){
    var isDataOk = true;
    var valToAppend = null;
    if(dataXml.table
    .column != null && dataXml.table.column.length >0){
    for(var j=0;j<dataXml.table
    .column.length;j++){
    if(dataXml.table.column[j] != null){
    //L'attribut est dans les conditions et la valeur ne correspond pas
    if(conditions[dataXml.table
    .column[j]["@name"]] != null && conditions[dataXml.table.column[j]["@name"]] != dataXml.table.column[j]["#text"]){
    isDataOk = false;

          }
    
          //L'attribut est celui voulu
          if(dataXml.table*.column[j]["@name"] != null && dataXml.table*.column[j]["@name"] == prop){
            valToAppend = dataXml.table*.column[j]["#text"];
          }
    
       }
      }
      if(isDataOk && valToAppend != null){
    
      //Si la valeur n'est pas déjà dans le tableau
    
     var isToAppend = true;
     for(var k=0;k<result.length;k++){
     if(valToAppend == result[k]){
     isToAppend = false;
     break;
     }
    
     }
     if(isToAppend){
        result.push(valToAppend);
     }
    
      }

    }
    }
    }

    return result;
    }

    var appendTabToSelect = function(tab,selectNumero){
    var select = $('select');
    if(select != null){
    for(var s=0;s<select.length;s++){
    if(select[s].dataset["numero"] <selectNumero){
    select[s].disabled = false;
    }else if(select[s].dataset["numero"] == selectNumero){
    select[s].disabled = false;

    $(select[s]).empty();
    for(var i=0;i<tab.length;i++){
    $(select[s]).append('<option name="'+tab+'">'+tab+'</option>');
    }
    select[s].value = "";
    }else{
    $(select[s]).empty();
    select[s].disabled = true;
    }
    }

    }
    }

    var afficheResultat = function(){

    $('#result').html(JSON.stringify(valSelect));
    }
    });
    </script>

[/code]

Le résultat est visible à cette adresse:

[url=http://grafikart-vocal.tk/testXmlJson]http://grafikart-vocal.tk/testXmlJson[/url]

La source téléchargeable à celle-ci :

[url=http://grafikart-vocal.tk/testXmlJson/zip.zip]http://grafikart-vocal.tk/testXmlJson/zip.zip[/url]

Cordialement

Anthony</n></xml.attributes.length>

antho07
Réponse acceptée

Code mis à jour en ligne et dans le zip

Tu peux tester?

Bonjour,

tu peux donner un exemple du format souhaité?

cordialement

Medlot
Auteur

merci por votre repnse
pour vous expliquer mieux, mon boulot est de réaliser 4 select nommée successivement: year, make, model, et trim
au début juste le select year est rempli par des valeurs statique (2001, 2005, 2009 ....), l'utilisateur va choisir une année le deuxiéme select doit être remplie par les make correspondant a cette année exp (year = 2001 => make data retreived = { Acura, bmw, Mercedes-Benz}) de meme pour le select trim et model
pour conclure j'ai un problème au niveau de classification des données retiré (comment je peux retirer les données du make correspond à une année bien définis , et comment retirer les données de trim et model pour une make bien defis....)
pour le moment il suffit de l'afficher sur la page web (sans select)

Tu as la main côté serveur pour éventuellement effectuer une transformation XSLT avant d'envoyer au navigateur ?

Medlot
Auteur

non, je dois retirer les donnes directement du fichier xml (partie de fichier xml au dessus) et afficher ces donnes sur la page web

En le transformant en objet JS , ça sera plus simple, je dois m"absenter, je te poste un exemple en fin d'après midi

Medlot
Auteur

ok merci beaucoup, je vous attend

Medlot
Auteur

Merci beaucoup vous êtes génial!

ATTENTION BOULETTE EN VUEEEEEEEEEEE

Remplacer ça :

$('select').on('change',function(e){
   if(this.value != ""){

     var nextNumero = parseInt(this.dataset.numero)+1;
     var $next = $('select[data-numero="'+nextNumero+'"]');
     for(i=0;i<nextNumero;i++){
     var el = $('select[data-numero="'+i+'"]')[0];
     valSelect = {}; // GROSSE BOULETTE ICI....
     valSelect[el.name]=el.value;
     }

     if($next != null && $next.length == 1){
     appendTabToSelect(getPropertiesWithConditions($next[0].name,valSelect),nextNumero);
     }
       afficheResultat(); 
   }

  });

par :

$('select').on('change',function(e){
   if(this.value != ""){

     var nextNumero = parseInt(this.dataset.numero)+1;
     var $next = $('select[data-numero="'+nextNumero+'"]');
  valSelect = {}; // ICI C'EST MIEUX !
     for(i=0;i<nextNumero;i++){
     var el = $('select[data-numero="'+i+'"]')[0];

     valSelect[el.name]=el.value;
     }

     if($next != null && $next.length == 1){
     appendTabToSelect(getPropertiesWithConditions($next[0].name,valSelect),nextNumero);
     }
       afficheResultat(); 
   }

  });

Fichiers serveurs mis à jour:)

Medlot
Auteur

merci une autre fois pour votre aide, mais ça reste un petit probléme, le code ne fonctionne pas sur quelque navigateur (firefox, et le navigateur mobile...)
svp si tu peu m'aider pour le fonctionner sur le navigateur mobile car l'application est orienté mobile

Quelle partie du code ne fonctionne pas? Y'as une utilisation dépréciée dans la librairie (du à son ancienneté), je vais essayer de la modifier si cela vient de là EDIT : En faite non ça vient d'un coup de bluff que j'ai tenté pour pas m'emm*** :( Bon bah va falloir faire propre ... Le problème est ça : select[s].value = ""; ligne 160. Je fixe et reposte

Medlot
Auteur

oui c'est parfait maintenant! Vous êtres super! Merci infiniment.

Pour info, j'ai juste rajouté un <option name=""></option> avant d'injecter les vrai valeurs au select.

Avant je forçais la value à vide meme si celle ci n'était pas dans la liste des options..

Certains navigateurs ne devaient pas apprécier.

J'ai besoin d'une valeur vide pour une raison technique:
au changement de la valeur select un traitement est lancé. En forçant cette valeur vide au remplissage du select, je force l'utilisateur à faire un choix (et non pas garder la valeur par defaut qui serait la premiere de la liste)et donc on dispatch cette event change qui me permet de lancer en callback le traitement via jquery.