2009-11-16 9 views
2

Je dois créer des objets personnalisés basés sur une entrée xml, la règle est que pour chaque nœud, s'il a un nœud enfant direct nommé EndNode et dont la valeur de texte est 1, alors je crée un objet feuille. Donc, pour chaque nœud, j'ai besoin de vérifier l'enfant direct avec le nom EndNode et sa valeur. Ce n'est pas si facile avec l'API Dom. et Dom sélecteur (dans ce cas, j'utilise Ext.DomQuery) n'a pas un moyen de sélectionner l'enfant direct du nœud racine ... ci-dessous est ma tentative d'utiliser Dom sélecteur, je dois envelopper le nœud autour d'un autre niveau de nœud pour que le sélecteur fonctionne. mais je ne peux pas simplement dire nouveau nœud(), il échoue silencieusement. Je suppose que je dois parcourir n.childNodes, mais il est compliqué de le faire de cette façon pour vérifier la règle que j'ai décrite ci-dessus. Toute solution?analyser xml en javascript

 
Ext.each(node.childNodes, function(n){ 
      if(n.nodeType == this.XML_NODE_ELEMENT){ 

       var tmp=new Node(); 
       console.log('hi'); 
       tmp.appendChild(n); 
       console.log(Ext.DomQuery.select(n.tagName+">EndNode", tmp)); 
} 
} 
+1

Cela peut être vraiment stupide, mais est-il possible d'obtenir les données en JSON? – Shawn

+0

@Shawn Non, ce n'est pas stupide. En fait, c'est une bonne idée. –

+0

Aussi, pour les débutants, j'embaquerais le tout dans 'try {...} catch (e) {console.warn (e); } ' –

Répondre

2

J'ai fait un analyseur XML. C'est assez facile avec la bibliothèque de Dojo. Ici vous êtes. Quand vous en aurez fini, je vous recommande d'exporter la variable vers JSON et de l'utiliser comme cache.

dojo.require("dojox.xml.parser"); 
var parser = dojox.xml.parser; 
function crules() { 
    this.rules = new Array(); 
    this.xml = Object; 
} 
xml = ''; 
crules.prototype.load = function(file){ 
    var xmlget = dojo.xhrGet({ 
     url: file, 
     handleAs: "xml", 
     load: function(data){ 
      xml = data; 
     }, 
     error: function (error) { 
      console.error ('Error: ', error); 
     }, 
     sync: true 
    } 
    ); 
    this.xml = xml; 
} 
crules.prototype.buildout = function(){ 
    var rules = this.xml.getElementsByTagName('ruleset'); 
    //dojo.byId('jsloading').innerHTML = 'Loading Javascript'; 
    for(var i=0; i<rules.length; i++){ 
     //dojo.byId('jsloading').innerHTML += ' .'; 
     r = new cruleset(); 
     r.name = xtagvalue(rules[i],'name'); 
     base = xtag(rules[i],'base'); 
     textcustom = xtag(rules[i],'textcustom'); 
     r.textcustomy = xtagvalue(textcustom[0],'y'); 
     r.textcustomx = xtagvalue(textcustom[0],'x'); 
     for(var j=0; j<base.length; j++){ 
      r.bases[j] = new cbase(); 
      r.bases[j].imgsrc = xtagvalue(base[j],'imgsrc'); 
      r.bases[j].color = xtagvalue(base[j],'color'); 
      r.bases[j].coloropts = new Array(); 
      var copts = xtag(rules[i],'option'); 
      for(var k=0; k<copts.length;k++){ 
       var cc = new Object(); 
       cc.color = xtagvalue(copts[k],'color'); 
       cc.imgsrc = xtagvalue(copts[k],'imgsrc'); 
       r.bases[j].coloropts.push(cc); 
      } 
     } 
     zones = xtag(rules[i],'zone'); 
     for(var j=0; j<zones.length; j++){ 
      z = new czone(); 
      z.name =xtagvalue(zones[j],'name'); 
      zoneconfigs = xtag(zones[j],'zoneconfig'); 
      for(var n=0; n<zoneconfigs.length; n++){ 
       zc = new czoneconfig(); 
       zc.name = z.name; 
       zc.x1 =xtagvalue(zones[j],'x1'); 
       zc.y1 =xtagvalue(zones[j],'y1'); 
       zc.w =xtagvalue(zones[j],'w'); 
       zc.h =xtagvalue(zones[j],'h'); 
       hotspots = xtag(zoneconfigs[n],'hotspot'); 
       for(var k=0; k<hotspots.length; k++){ 
        h = new chotspot(); 
        h.name = xtagvalue(hotspots[k],'name'); 
        h.x =xtagvalue(hotspots[k],'x'); 
        h.y =xtagvalue(hotspots[k],'y'); 
        h.nameyoffset = xtagvalue(hotspots[k],'nameyoffset'); 
        h.accessoryonly = xtagvalue(hotspots[k],'accessoryonly'); 
        if(h.accessoryonly == null){ 
         h.accessoryonly = 0; 
        } 
        var showname = xtag(hotspots[k],'showname'); 
        if(!isEmpty(showname)){ 
         h.showname = xtagvalue(hotspots[k],'showname'); 
        } 
        /*h.itemset =xtagvalue(hotspots[k],'itemset');*/ 
        items = xtag(hotspots[k],'item'); 
        if(items){ 
         for(var l=0;l<items.length;l++){ 
          t = new citem(); 
          t.id = xtagvalue(items[l],'id'); 
          h.items[h.items.length] = t; 
         } 
        } 
        zc.hotspots[zc.hotspots.length] = h; 
       } 
       z.zoneconfigs[z.zoneconfigs.length] = zc; 
      } 
      r.zones[r.zones.length] = z; 
     } 
     this.rules[this.rules.length] = r; 
    } 
    /*xmltext = parser.innerXML(xml); 
     dojo.byId('cwindow').innerHTML = xmltext;*/ 
} 

function xtag(e,tag){ 
    var n=null; 
    n = e.getElementsByTagName(tag); 
    if(n.length>=1){ 
     return e.getElementsByTagName(tag); 
    } 
    else return null; 
} 
function xtagvalue(e,tag){ 
    var n=null; 
    n = e.getElementsByTagName(tag); 
    if(n.length>=1){ 
     //console.log(tag,'here',n[0],parser.textContent(n[0])); 
     return parser.textContent(n[0]); 
    } 
    else return null; 
} 
+0

Répondez à votre question? –

+1

LOL - J'aime ce que vous dites "assez facile", suivi de plus de 100 lignes de code! J'espère qu'il y a une solution plus simple, j'en cherche une moi-même et je finirai probablement par utiliser JSON. – Karthik