Javascript 如何从XML文档中获取对象?

Javascript 如何从XML文档中获取对象?,javascript,xml,node.js,parsing,libxml-js,Javascript,Xml,Node.js,Parsing,Libxml Js,当使用Node.js中优秀的libxmljs库解析文档时,我偶然发现了一个案例,其中发现了大量嵌套元素,我唯一要做的就是从中创建一个js对象 下面是代码的样子: if (node.type() == 'element') { switch(node.name()) { case 'element1': { myObject.element1 = {} for (var i = 0; i < node

当使用Node.js中优秀的
libxmljs
库解析文档时,我偶然发现了一个案例,其中发现了大量嵌套元素,我唯一要做的就是从中创建一个js对象

下面是代码的样子:

if (node.type() == 'element') {
        switch(node.name()) {
          case 'element1': {
              myObject.element1 = {}
              for (var i = 0; i < node.childNodes().length; i++) {
                  if(node.type() == 'element') {
                      switch(node.name()) {
                          case 'element2': {
                              myObject.element1.element2 = node.text()
                              ...
}}}}}}}} 
/* didn't count the number of closing brackets, but you get the idea ^_^ */
if(node.type()=“element”){
开关(node.name()){
案例“元素1”:{
myObject.element1={}
对于(var i=0;i
使用libxmlJS从XML字符串(或其中的一部分)创建对象,是否有一种更快或内置的方法来完成这些事情?

注意,如果有帮助的话,解析的XML必须根据XTD模式进行验证(使用这个库很容易做到)


谢谢

以下是一些非工作代码,可在以下网站上找到:

从这段代码中,我可以构建一些似乎能与最新libxmljs版本一起工作的东西,如下所示:

function XML2jsobj(node) {
    var data = {};

    // append a value
    function Add(name, value) {
        if (data[name]) {
            if (data[name].constructor != Array) {
                data[name] = [data[name]];
            }
            data[name][data[name].length] = value;
        }
        else {
            data[name] = value;
        }
    };

    for (var c = 0; c < node.attrs().length; c++) {
        var cn = node.attrs()[c];
        Add(cn.name, cn.value);
    }

    // child elements
    for (var c = 0; c < node.childNodes().length; c++) {
        var cn = node.childNodes()[c];
        if (cn.type() == 'element') {
            if (cn.childNodes().length == 1 && cn.childNodes()[0].type() == 'text') {
                // text value
                Add(cn.name(), cn.childNodes()[0].text());
            }
            else {
                // sub-object
                Add(cn.name(), XML2jsobj(cn));
            }
        }
    }

    return data;
}
函数XML2jsobj(节点){
变量数据={};
//附加值
函数添加(名称、值){
if(数据[名称]){
if(数据[name].constructor!=数组){
数据[名称]=[数据[名称];
}
数据[名称][数据[名称].长度]=值;
}
否则{
数据[名称]=值;
}
};
对于(var c=0;c

我希望这会对某人有所帮助。

以下是一些不工作的代码,可以在以下网站上找到:

从这段代码中,我可以构建一些似乎能与最新libxmljs版本一起工作的东西,如下所示:

function XML2jsobj(node) {
    var data = {};

    // append a value
    function Add(name, value) {
        if (data[name]) {
            if (data[name].constructor != Array) {
                data[name] = [data[name]];
            }
            data[name][data[name].length] = value;
        }
        else {
            data[name] = value;
        }
    };

    for (var c = 0; c < node.attrs().length; c++) {
        var cn = node.attrs()[c];
        Add(cn.name, cn.value);
    }

    // child elements
    for (var c = 0; c < node.childNodes().length; c++) {
        var cn = node.childNodes()[c];
        if (cn.type() == 'element') {
            if (cn.childNodes().length == 1 && cn.childNodes()[0].type() == 'text') {
                // text value
                Add(cn.name(), cn.childNodes()[0].text());
            }
            else {
                // sub-object
                Add(cn.name(), XML2jsobj(cn));
            }
        }
    }

    return data;
}
函数XML2jsobj(节点){
变量数据={};
//附加值
函数添加(名称、值){
if(数据[名称]){
if(数据[name].constructor!=数组){
数据[名称]=[数据[名称];
}
数据[名称][数据[名称].长度]=值;
}
否则{
数据[名称]=值;
}
};
对于(var c=0;c

我希望这会对某些人有所帮助。

这需要递归解决方案,而不是显式处理每个“级别”的静态解决方案。这需要递归解决方案,而不是显式处理每个“级别”的静态解决方案。