欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何利用JavaScript将XML转换为JSON?

程序员文章站 2022-05-11 07:57:28
最近在开发项目时遇到了一个需求,从查询出来的xml报文的字符串需要解析处参数来,在页面上支持修改,所以催生了利用javascript来实现解析xml文本的功能。 具体思路是现获取...

最近在开发项目时遇到了一个需求,从查询出来的xml报文的字符串需要解析处参数来,在页面上支持修改,所以催生了利用javascript来实现解析xml文本的功能。

具体思路是现获取xml的dom对象,然后再通过遍历和递归获取子元素的nodevalue,来拼接出json字符串。


通过xml字符串来生成xml的dom对象:

/**
 * 通过传入xml的内容字符串来解析xml
 * @param xmlstring xml字符串
 * @returns xml的document对象
 */
function getxmldocumentbyxmlstring(xmlstring) {
    var xmldoc = null;
    if (window.domparser) {
        var parser = new domparser();
        xmldoc = parser.parsefromstring(xmlstring, "text/xml");
    } else {
        //ie
        xmldoc = new activexobject("microsoft.xmldom");
        xmldoc.async = "false";
        xmldoc.loadxml(xmlstring);
    }
    return xmldoc;
}

或者通过请求xml文件来获取xml的dom对象:

/**
 * 通过传入xml文件路径来解析xml文档
 * @param xmlfilepath xml文档路径,如:files/test.xml
 * @returns xml的document对象
 */
function getxmldocumentbyfilepath(xmlfilepath) {
    //xmldocument对象
    var xmldoc = null;
    //xmlhttp对象
    var xmlhttp = null;
    if (window.xmlhttprequest) {
        //ie7+, firefox, chrome, opera, safari
        xmlhttp = new xmlhttprequest();
    } else {
        //ie6, ie5
        xmlhttp = new activexobject("microsoft.xmlhttp");
    }

    xmlhttp.open("get", xmlfilepath, false);
    xmlhttp.send();
    xmldoc = xmlhttp.responsexml;
    return xmldoc;
}

接下来就是重点的部分了,将xml转换成json字符串:

/**
 * 将xml的document对象转换为json字符串
 * @param xmldoc xml的document对象
 * @return string
 */
function converttojson(xmldoc) {
    //准备json字符串和缓存(提升性能)
    var jsonstr = "";
    var buffer = new array();

    buffer.push("{");
    //获取xml文档的所有子节点
    var nodelist = xmldoc.childnodes;

    generate(nodelist);

    /**
     * 中间函数,用于递归解析xml文档对象,并附加到json字符串中
     * @param node_list xml文档的的nodelist
     */
    function generate(node_list) {

        for (var i = 0; i < node_list.length; i++) {
            var curr_node = node_list[i];
            //忽略子节点中的换行和空格
            if (curr_node.nodetype == 3) {
                continue;
            }
            //如果子节点还包括子节点,则继续进行遍历
            if (curr_node.childnodes.length > 1) {
                buffer.push("\"" + curr_node.nodename + "\": {");
                generate(curr_node.childnodes);
            } else {
                var firstchild = curr_node.childnodes[0];

                if (firstchild != null) {
                    //nodevalue不为null
                    buffer.push("\"" + curr_node.nodename + "\":\"" + firstchild.nodevalue + "\"");
                } else {
                    //nodevalue为null
                    buffer.push("\"" + curr_node.nodename + "\":\"\"");
                }

            }
            if (i < (node_list.length - 2)) {
                buffer.push(",");
            } else {
                break;
            }
        }
        //添加末尾的"}"
        buffer.push("}");
    }

    jsonstr = buffer.join("");
    return jsonstr;
}

使用方式:通过getxmldocumentbyfilepath(xmlfilepath)或者getxmldocumentbyxmlstring(xmlstring)获取xml的document对象,然后通过调用converttojson(xmldocument)传入xml的ducument对象即可得到转换后的json字符串。

适用范围:不含有attribute的任意xml文档。

当前只是第一版本的xml转json的工具,可能会有很多不足和需要改进的地方,欢迎大家一起交流。我会在github上更新最新的代码,项目地址:https://github.com/tsuixh/xml_json_converter_tool,欢迎大家提出问题!