跨浏览器 Javascript XML 解析

有没有跨浏览器/跨平台的方法来解析 Javascript 中的 XML 文件?

49083 次浏览

考虑使用 ParseXML

请注意,旧的 JQuery 代码(pre 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;
}
.....
},

以下内容可以在所有主流浏览器中使用,包括 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;

如果需要解析可能无法完全保存在内存中的大型 XML 文档,可以考虑使用类似于 https://github.com/isaacs/sax-js/的 SAX 样式解析器