Cross-Browser Javascript XML Parsing

前端 未结 3 1942
梦谈多话
梦谈多话 2020-11-22 08:34

Are there any cross-browser / cross-platform ways to parse XML files in Javascript?

相关标签:
3条回答
  • 2020-11-22 08:46

    If you need to parse large XML documents that you may not be able to completely hold in memory, consider using a SAX style parser like this one: https://github.com/isaacs/sax-js/

    0 讨论(0)
  • 2020-11-22 08:47

    The following will work in all major browsers, including IE 6:

    var parseXml;
    
    if (typeof window.DOMParser != "undefined") {
        parseXml = function(xmlStr) {
            return ( new window.DOMParser() ).parseFromString(xmlStr, "text/xml");
        };
    } else if (typeof window.ActiveXObject != "undefined" &&
           new window.ActiveXObject("Microsoft.XMLDOM")) {
        parseXml = function(xmlStr) {
            var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async = "false";
            xmlDoc.loadXML(xmlStr);
            return xmlDoc;
        };
    } else {
        throw new Error("No XML parser found");
    }
    

    Example usage:

    var xml = parseXml("<foo>Stuff</foo>");
    alert(xml.documentElement.nodeName);
    

    Live demo:

    var parseXml;
    
    if (typeof window.DOMParser != "undefined") {
        parseXml = function(xmlStr) {
            return ( new window.DOMParser() ).parseFromString(xmlStr, "text/xml");
        };
    } else if (typeof window.ActiveXObject != "undefined" &&
           new window.ActiveXObject("Microsoft.XMLDOM")) {
        parseXml = function(xmlStr) {
            var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async = "false";
            xmlDoc.loadXML(xmlStr);
            return xmlDoc;
        };
    } else {
        throw new Error("No XML parser found");
    }
    
    var xml = parseXml("<foo>Stuff</foo>");
    document.body.innerHTML = "Root element: " + xml.documentElement.nodeName;

    0 讨论(0)
  • 2020-11-22 08:59

    Consider using jQuery.parseXML.

    Note that old JQuery's code (pre 2.x) is essentially identical to one proposed in the accepted answer and can be found at http://code.jquery.com/jquery-1.9.1.js, partial version below:

    // Cross-browser xml parsing
    parseXML: function( data ) {
        ...
        try {
            if ( window.DOMParser ) { // Standard
                tmp = new DOMParser();
                xml = tmp.parseFromString( data , "text/xml" );
            } else { // IE
                xml = new ActiveXObject( "Microsoft.XMLDOM" );
                xml.async = "false";
                xml.loadXML( data );
            }
        } catch( e ) {
            xml = undefined;
        }
        ...
    }
    

    Starting JQuery 2.x code changed to skip ActiveX branch, if you still need it - use older version of JQuery or inline ActiveX parsing. Partial code from http://code.jquery.com/jquery-2.0.0.js:

    // Cross-browser xml parsing
    parseXML: function( data ) {
        var xml, tmp;
        .....
        // Support: IE9
        try {
            tmp = new DOMParser();
            xml = tmp.parseFromString( data , "text/xml" );
        } catch ( e ) {
            xml = undefined;
        }
        .....
    },
    
    0 讨论(0)
提交回复
热议问题