javascript - 在javascript中解析xml

标签 javascript dom

我需要基于 XML 输入创建自定义对象,规则是对于每个节点,如果它有一个直接子节点,则命名为 EndNode,其文本值为 1 ,然后我创建一个叶对象。因此,对于每个节点,我都需要检查名称为 EndNode 的直接子节点及其值。使用 DOM API 并不容易,DOM 选择器(在本例中我使用 Ext.DomQuery)没有办法选择根节点的直接子节点...下面是我的尝试使用 DOM 选择器,我需要用节点的另一个级别将节点包裹起来,以便选择器工作。但我不能只说 new Node(),它会默默地失败。 我想我必须遍历 n.childNodes,但是以这种方式检查我上面描述的规则很复杂。有什么解决办法吗?

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));
    }
}

最佳答案

我做了一个 xml 解析器。使用 Dojo 的库非常容易。你在这里。当你完成它时,虽然我建议将 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;
}

关于javascript - 在javascript中解析xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1744385/

相关文章:

odoo 12 中的 JavaScript

javascript - 需要找到更有效的解决方案来将空白写入页面

javascript - Javascript 中的点击事件计数器

javascript - 选择angular2中的多个dom元素

javascript - 在 div 中查找任何类型的第一个可聚焦项目

php - 获取 ul li 一个字符串值并将它们存储在变量或数组 php

javascript - ajax不调用成功或错误函数

javascript - 获取匹配日期的 MongoDB 项目

java - 如何操作Java小程序网页的DOM

javascript - 将字段单独添加到 firestore 文档