2009-11-16 5 views
2

Мне нужно создать пользовательские объекты на основе ввода xml, это правило для каждого узла, если у него есть прямой дочерний узел, называется EndNode, а текстовое значение которого равно 1, тогда я создаю листовой объект. Поэтому для каждого узла мне нужно проверить прямой дочерний элемент с именем EndNode и его значением. Домен API не так прост. и селектор Dom (в этом случае я использую Ext.DomQuery) не имеет способа выбрать прямой дочерний элемент корневого узла ... ниже моя попытка использовать селектор Dom, мне нужно обернуть узел вокруг с другим уровнем узел для работы селектора. но я не могу просто сказать новый Node(), он бесшумно терпит неудачу. Я думаю, мне нужно пройти через n.childNodes, но это сложно сделать, чтобы проверить правило, описанное выше. Любое решение?синтаксический анализ xml в 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

Это может быть действительно глупо, но можно ли получить данные в JSON? – Shawn

+0

@ Шаун Нет, это не глупо. На самом деле, это хорошая идея. –

+0

Кроме того, для начала я обернул бы все это в 'try {...} catch (e) {console.warn (e); } ' –

ответ

2

Я сделал XML-парсер. Это очень легко с библиотекой Додзё. Вот вам. Когда вы закончите с этим, хотя я рекомендую экспортировать var в JSON и использовать его в качестве кеша.

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

Ответьте на свой вопрос? – 2009-11-25 05:37:11

+1

LOL - Мне нравится, как вы говорите «довольно легко», а затем следуйте за> 100 строками кода! Надеюсь, что есть более простое решение, я ищу его сам и, вероятно, в конечном итоге буду использовать JSON. – Karthik

Смежные вопросы