Existe-t-il des moyens d'analyser les fichiers XML en Javascript qui soient compatibles avec les navigateurs et les plates-formes ?
Réponses
Trop de publicités?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;
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;
}
.....
},
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/