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

  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