跨浏览器的Javascript XML解析

74

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


3
请访问https://dev59.com/i3RB5IYBdhLWcg3wXWG2,了解如何在JavaScript中解析XML。 - Milan Jaric
这不是 https://dev59.com/i3RB5IYBdhLWcg3wXWG2#8412989 的重复吗? - lucascaro
这个问题是最早请求跨平台XML解析器的问题之一,但它因为要求一个非本站资源而被关闭,被认为是不相关的(就像这个问题一样)。 - Graham
3个回答

72

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


2
这段代码可以正常工作,但在IE9标准模式下会出现问题。为了解决这个问题,你只需要修改初始的if语句,使其类似于:if (window.DOMParser && typeof XMLDocument !== "undefined")。 - GotDibbs
1
@GotDibbs:我知道已经有一段时间了,但这是一个在IE 9标准模式下对我有效的jsFiddle链接:http://jsfiddle.net/3s7Ly/1/。 - Tim Down
@TimDown:如果这是一个可行版本,您介意将其编辑到您的答案中吗? - nhahtdh
@TimDown 这段代码在所有浏览器中(特别是Chrome、Firefox和IE)仍然可靠吗?或者更好的是,是否有一种不依赖于ActiveX对象的这段代码片段的版本? - Bradley
@Bradley:DOMParser现在已经标准化,所以这段代码不应该变得不可靠。它可以在所有主流浏览器的当前版本中运行。它只会在旧版IE中回退到ActiveX,如果您不关心那些版本,那么可以删除ActiveX代码分支,但如果保留也不会有任何问题。 - Tim Down
显示剩余3条评论

7

考虑使用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;
    }
    .....
},

2
jQuery.parseXml可能会很慢。我建议看一下@TimDown的帖子。 - GotDibbs
8
也许是一年前的事了,但看了jQuery的源代码(http://code.jquery.com/jquery-1.9.1.js)后,我没能看出与TimDown的答案有什么不同(省略了一些错误处理逻辑)。 - zbstof
@Zotov 我已经将你的评论嵌入到帖子中了(该帖子因为只有链接而被合理地下降了评分,但是你的评论看起来值得嵌入而不是删除帖子)。 - Alexei Levenkov

4

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接