有没有跨浏览器/跨平台的方法可以在Javascript中解析XML文件?
有没有跨浏览器/跨平台的方法可以在Javascript中解析XML文件?
以下内容适用于所有主流浏览器,包括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");
}
示例用法:
var xml = parseXml("<foo>Stuff</foo>");
alert(xml.documentElement.nodeName);
演示实例:
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;
DOMParser
现在已经标准化,所以这段代码不应该变得不可靠。它可以在所有主流浏览器的当前版本中运行。它只会在旧版IE中回退到ActiveX,如果您不关心那些版本,那么可以删除ActiveX代码分支,但如果保留也不会有任何问题。 - Tim Down考虑使用jQuery.parseXML。
请注意,旧版的JQuery代码(2.x之前)与被接受答案中提出的代码基本相同,可以在http://code.jquery.com/jquery-1.9.1.js找到部分版本:
// 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;
}
...
}
从JQuery 2.x版本开始,代码不再支持ActiveX分支,如果您仍需要使用它,请使用旧版本的JQuery或内联ActiveX解析。以下是来自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;
}
.....
},
如果您需要解析大型XML文档,而您可能无法完全保存在内存中,请考虑使用SAX样式的解析器,例如此解析器:https://github.com/isaacs/sax-js/