73 votes

Parsing XML en Javascript multi-navigateur

Existe-t-il des moyens d'analyser les fichiers XML en Javascript qui soient compatibles avec les navigateurs et les plates-formes ?

72voto

Tim Down Points 124501

Ce qui suit fonctionnera dans tous les principaux navigateurs, y compris 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");
}

Exemple d'utilisation :

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

Démonstration en direct :

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;

7voto

Alexei Levenkov Points 49945

Envisagez d'utiliser jQuery.parseXML .

Notez que l'ancien code de JQuery (avant 2.x) est essentiellement identique à celui proposé dans la réponse acceptée et peut être trouvé à l'adresse suivante http://code.jquery.com/jquery-1.9.1.js , version partielle ci-dessous :

// 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;
    }
    ...
}

Le code de JQuery 2.x a été modifié pour sauter la branche ActiveX. Si vous en avez toujours besoin, utilisez une version plus ancienne de JQuery ou un analyseur ActiveX en ligne. Code partiel de 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;
    }
    .....
},

4voto

Janus Troelsen Points 5121

Si vous avez besoin d'analyser des documents XML volumineux que vous n'êtes pas en mesure de conserver entièrement en mémoire, envisagez d'utiliser un analyseur de style SAX comme celui-ci : https://github.com/isaacs/sax-js/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X