XML to JavaScript Object

后端 未结 4 1783
情歌与酒
情歌与酒 2020-11-27 19:12

I am looking for a JavaScript library that parses an XML string and converts it to a JavaScript object. What are some good ones?

4条回答
  •  我在风中等你
    2020-11-27 19:30

    parses XML and returns a javascript object w/ a scheme that corresponds the xml. xml siblings w/ the same name are collapsed into arrays. nodes with names that can be found in the arrayTags parameter (array of tag name strings) always yeld arrays even in case of only one tag occurrence. arrayTags can be omitted. text nodes w/ only spaces are discarded. use console.log(parseXml(myxml)) to explore the output

    parseXml(xml, arrayTags)
    {
        var dom = null;
        if (window.DOMParser)
        {
            dom = (new DOMParser()).parseFromString(xml, "text/xml");
        }
        else if (window.ActiveXObject)
        {
            dom = new ActiveXObject('Microsoft.XMLDOM');
            dom.async = false;
            if (!dom.loadXML(xml))
            {
                throw dom.parseError.reason + " " + dom.parseError.srcText;
            }
        }
        else
        {
            throw "cannot parse xml string!";
        }
    
        function isArray(o)
        {
            return Object.prototype.toString.apply(o) === '[object Array]';
        }
    
        function parseNode(xmlNode, result)
        {
            if (xmlNode.nodeName == "#text") {
                var v = xmlNode.nodeValue;
                if (v.trim()) {
                   result['#text'] = v;
                }
                return;
            }
    
            var jsonNode = {};
            var existing = result[xmlNode.nodeName];
            if(existing)
            {
                if(!isArray(existing))
                {
                    result[xmlNode.nodeName] = [existing, jsonNode];
                }
                else
                {
                    result[xmlNode.nodeName].push(jsonNode);
                }
            }
            else
            {
                if(arrayTags && arrayTags.indexOf(xmlNode.nodeName) != -1)
                {
                    result[xmlNode.nodeName] = [jsonNode];
                }
                else
                {
                    result[xmlNode.nodeName] = jsonNode;
                }
            }
    
            if(xmlNode.attributes)
            {
                var length = xmlNode.attributes.length;
                for(var i = 0; i < length; i++)
                {
                    var attribute = xmlNode.attributes[i];
                    jsonNode[attribute.nodeName] = attribute.nodeValue;
                }
            }
    
            var length = xmlNode.childNodes.length;
            for(var i = 0; i < length; i++)
            {
                parseNode(xmlNode.childNodes[i], jsonNode);
            }
        }
    
        var result = {};
        for (let i = 0; i < dom.childNodes.length; i++)
        {
            parseNode(dom.childNodes[i], result);
        }
    
        return result;
    }
    

提交回复
热议问题