跨浏览器 Javascript XML 解析

IT技术 javascript xml cross-browser cross-platform
2021-01-30 04:33:58

是否有任何跨浏览器/跨平台的方式来解析 Javascript 中的 XML 文件?

3个回答

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

这有效,除了在标准模式下的 IE9 中。在 IE9 标准模式下纠正这个问题,你只需要将你的初始 if 语句改成这样: if (window.DOMParser && typeof XMLDocument !== "undefined")
2021-03-11 04:33:58
@GotDibbs:我知道已经有一段时间了,但这里有一个 jsFiddle,它在 IE 9 标准模式下对我来说很好用:jsfiddle.net/3s7Ly/1
2021-03-18 04:33:58
是的。不确定这里是否有其他设置阻碍,但是当我进入开发工具栏并将浏览器模式切换到 IE9 并将文档模式切换到 IE9 标准时,它会在没有额外检查的情况下爆炸。
2021-03-22 04:33:58
@GotDibbs:真的吗?上面的例子在 IE 9 标准中对我来说很好。
2021-03-29 04:33:58
@TimDown:如果它是一个工作版本,你介意把它编辑成你的答案吗?
2021-04-04 04:33:58

考虑使用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;
    }
    .....
},
也许是一年前,但查看 jQuery 的源代码(code.jquery.com/jquery-1.9.1.js),我看不出与 TimDown 的答案的区别(省略了一些错误处理逻辑)。
2021-03-22 04:33:58
@Zotov 我已经内联了您的评论(帖子被正确地贬低为仅链接,并且您的评论看起来值得内联而不是删除帖子)。
2021-04-03 04:33:58
jQuery.parseXml 可能很慢。我建议查看@TimDown 的帖子
2021-04-10 04:33:58

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