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 :

JS: xml2json en pur JS


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 49
    Par défaut JS: xml2json en pur JS
    hello

    comme d'hab je passe par ici quand j'ai épuisé toutes les possibilités...
    bref j'ai besoin de transformer du texte XML en objet JSON.

    la raison ? c'est pour lire les fichiers NFO avec mediatomb (DLNA).
    mediatomb est compilé avec libjs.so.1 ce qui lui permet d'avoir un interpréteur JS. Javascript uniquement.
    => Pas d'ojets DOM, pas de fonctionnalités ie, firefox, pas d'AJAX, pas d'XmlHttpRequest, pas de jQuery, etc

    je dois donc parvenir à convertir un texte XML en objet JSON.
    Inutile de vous dire que 99% des solutions que j'ai trouvé sur le net sont basées sur DOM et AJAX.

    j'ai trouvé seulement UN seul exemple : http://www.thomasfrank.se/downloadableJS/xml2json.js

    seulement il ne marche pas en pure JS. J'ai transfprmé toutes les classes en fonctions, et testé sur une page html simple : ça marche bien.
    avec le JS de mediatomb ça ne marche pas.

    est-ce que quelqu'un peut il me dire si j'ai pas oublié un objet ou une classe spécifique dans le code qui reste ??

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    function xml2json(xmlcode,ignoretags,debug){
                    if(!ignoretags){ignoretags=""};
                    xmlcode=xmlcode.replace(/\s*\/>/g,'/>');
                    xmlcode=xmlcode.replace(/<\?[^>]*>/g,"").replace(/<\![^>]*>/g,"");
                    if (!ignoretags.sort){ignoretags=ignoretags.split(",")};
                    var x=no_fast_endings(xmlcode);
                    x=attris_to_tags(x);
                    x=escape(x);
                    x=x.split("%3C").join("<").split("%3E").join(">").split("%3D").join("=").split("%22").join("\"");
                    for (var i=0;i<ignoretags.length;i++){
                            x=x.replace(new RegExp("<"+ignoretags[i]+">","g"),"*$**"+ignoretags[i]+"**$*");
                            x=x.replace(new RegExp("</"+ignoretags[i]+">","g"),"*$***"+ignoretags[i]+"**$*");
                    };
                    x='<JSONTAGWRAPPER>'+x+'</JSONTAGWRAPPER>';
                    xmlobject={};
                    // var y=this.xml_to_object(x).jsontagwrapper;
                    var y=xml_to_object(x).jsontagwrapper;
                    if(debug){y=show_json_structure(y,debug);}
                    return y;
    }
    function xml_to_object(xmlcode){
                    var x=xmlcode.replace(/<\//g,"§");
                    x=x.split("<");
                    var y=[];
                    var level=0;
                    var opentags=[];
                    for (var i=1;i<x.length;i++){
                            var tagname=x[i].split(">")[0];
                            opentags.push(tagname);
                            level++;
                            y.push(level+"<"+x[i].split("§")[0]);
                            while (x[i].indexOf("§"+opentags[opentags.length-1]+">")>=0) {level--;opentags.pop();}
                    };
                    var oldniva=-1;
                    var objname="xmlobject";
                    for (var i=0;i<y.length;i++){
                            var preeval="";
                            var niva=y[i].split("<")[0];
                            var tagnamn=y[i].split("<")[1].split(">")[0];
                            tagnamn=tagnamn.toLowerCase();
                            var rest=y[i].split(">")[1];
                            if(niva<=oldniva){
                                    var tabort=oldniva-niva+1;
                                    for (var j=0;j<tabort;j++){objname=objname.substring(0,objname.lastIndexOf("."));}
                            }
                            objname+="."+tagnamn;
                            var pobject=objname.substring(0,objname.lastIndexOf("."));
                            if (eval("typeof "+pobject) != "object") {preeval+=pobject+"={value:"+pobject+"};\n";}
                            var objlast=objname.substring(objname.lastIndexOf(".")+1);
                            var already=false;
                            for (k in eval(pobject)) {if(k==objlast) {already=true;}}
                            var onlywhites=true;
                            for (var s=0;s<rest.length;s+=3){
                                    if (rest.charAt(s)!="%") {onlywhites=false;}
                            };
                            if (rest!="" && !onlywhites){
                                    if (rest/1!=rest){
                                            rest="'"+rest.replace(/\'/g,"\\'")+"'";
                                            rest=rest.replace(/\*\$\*\*\*/g,"</");
                                            rest=rest.replace(/\*\$\*\*/g,"<");
                                            rest=rest.replace(/\*\*\$\*/g,">");
                                    }
                            }
                            else {rest="{}"}
                            if (rest.charAt(0)=="'") {rest='unescape('+rest+')';}
                            if (already && !eval(objname+".sort")) {preeval+=objname+"=["+objname+"];\n";}
                            var before="=";after="";
                            if (already) {before=".push(";after=")";}
                            var toeval=preeval+objname+before+rest+after;
                            eval(toeval);
                            if (eval(objname+".sort")) {objname+="["+eval(objname+".length-1")+"]";}
                            oldniva=niva;
                    };
                    return xmlobject;
    }
    function show_json_structure(object,debug,l){
                    var x='';
                    if (object.sort){x+="[\n";} else {x+="{\n";};
                    for (var i in object){
                            if (!object.sort){x+=i+":"};
                            if (typeof object[i] == "object"){
                                    x+=show_json_structure(object[i],false,1);
                            }
                            else {
                                    if(typeof object[i]=="function"){
                                            var v=object[i]+"";
                                            //v=v.replace(/\t/g,"");
                                            x+=v
                                    }
                                    else if (typeof object[i]!="string") {x+=object[i]+",\n";}
                                    else {
    				x+="'"+object[i].replace(/\'/g,"\\'").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r")+"',\n";
    				}
                            }
                    };
                    if (object.sort){x+="],\n"} else {x+="},\n"}
                    if (!l){
                            x=x.substring(0,x.lastIndexOf(","));
                            x=x.replace(new RegExp(",\n}","g"),"\n}");
                            x=x.replace(new RegExp(",\n]","g"),"\n]");
                            var y=x.split("\n");x="";
                            var lvl=0;
                            for (var i=0;i<y.length;i++){
                                    if (y[i].indexOf("}")>=0 || y[i].indexOf("]")>=0) {lvl--;}
                                    tabs="";for(var j=0;j<lvl;j++){tabs+="\t"};
                                    x+=tabs+y[i]+"\n";
                                    if (y[i].indexOf("{")>=0 || y[i].indexOf("[")>=0) {lvl++;}
                            };
                            if(debug=="html"){
                                    x=x.replace(/</g,"&lt;").replace(/>/g,"&gt;");
                                    x=x.replace(/\n/g,"<BR>").replace(/\t/g,"&nbsp;&nbsp;&nbsp;&nbsp;");
                            };
                            if (debug=="compact") {x=x.replace(/\n/g,"").replace(/\t/g,"");}
                    };
                    return x;
    }
    function no_fast_endings(x){
                    x=x.split("/>");
                    for (var i=1;i<x.length;i++){
                            var t=x[i-1].substring(x[i-1].lastIndexOf("<")+1).split(" ")[0];
                            x[i]="></"+t+">"+x[i];
                    };
                    x=x.join("");
                    return x;
    }
    function attris_to_tags(x){
                    var d=' ="\''.split("");
                    x=x.split(">");
                    for (var i=0;i<x.length;i++){
                            var temp=x[i].split("<");
                            for (var r=0;r<4;r++){temp[0]=temp[0].replace(new RegExp(d[r],"g"),"_jsonconvtemp"+r+"_");};
                            if(temp[1]){
                                    temp[1]=temp[1].replace(/'/g,'"');
                                    temp[1]=temp[1].split('"');
                                    for (var j=1;j<temp[1].length;j+=2){
                                            for (var r=0;r<4;r++){temp[1][j]=temp[1][j].replace(new RegExp(d[r],"g"),"_jsonconvtemp"+r+"_");}
                                    };
                                    temp[1]=temp[1].join('"');
                            };
                            x[i]=temp.join("<");
                    };
                    x=x.join(">");
                    x=x.replace(/ ([^=]*)=([^ |>]*)/g,"><$1>$2</$1");
                    x=x.replace(/>"/g,">").replace(/"</g,"<");
                    for (var r=0;r<4;r++){x=x.replace(new RegExp("_jsonconvtemp"+r+"_","g"),d[r]);};
                    return x;
    }
    utilisation : myJsonObject=xml2json(xml_string);

    exemple de xml_string :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var xml_string="<movie><title>Village of the Damned</title><originaltitle>Village of the Damned</originaltitle><votes>6816</votes></movie>";
    comment savoir si ce code est pure JS ?
    merci de votre aide

  2. #2
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    c'est quoi tout ce fatra
    je ne vois pas à quoi ça peut servir mais ton navigateur sais déjà lire du xml
    si tu lis la source à partir de WHR tu as responseXml qui contient le DOM correspondant
    c'est du texte saisi par l'utilisateur dans un champs texte
    tu récupère sa valeur tu crée un div invisible et tu fait un innerHTML dessus pour y coller ton texte un accès à ton div te donne la encore le DOM correspondant
    et enfin si c'est ton serveur qui génère le xml et le colle dans la page à sa création il est bien plus simple de faire ça côté serveur. il suffit de mettre le xml dans le HTML pour que le navigateur crée le DOM

    le parsing de XML peut être fait par le navigateur et non pas un bricolage en javascript

    ensuite il te suffit pour de parcourir l'arbre et de mettre tout ça dans un objet javascript la méthode est simple si le neud courant est un textNode tu retour se oncontenu (String) sinon tu créé un objet avec le non neud et tu apelle récurcivement la même fonction sur tous les fils en 4 lignes c'est fait

    pour finif tu fait JSON.stringify sur ton objet est c'est fini
    pas de chaine à bricoler de concaténation rien juste des affectation de variable et un appel à JSON

    A+JYT

Discussions similaires

  1. Pur débutant en C/C++ : Taille des exécutables ?
    Par ChrisPM dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 20/10/2005, 18h39
  2. [Hebergement] Athlon 64 ou PIV ( ou Celeron ) pur du php / mysql
    Par Stef784ever dans le forum Hébergement
    Réponses: 5
    Dernier message: 26/09/2005, 19h14
  3. Directx en pur C , c'est une pure utopie?
    Par acetyle dans le forum DirectX
    Réponses: 61
    Dernier message: 07/07/2005, 15h36
  4. covertir du html en pur text
    Par faamugol dans le forum ASP
    Réponses: 2
    Dernier message: 16/04/2004, 14h43
  5. [TP]Portage d'un encodeur MP3 Fortran en pur Pascal...
    Par Christophe Fantoni dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 04/07/2003, 17h34

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