跨浏览器 Javascript XML 解析

Posted

技术标签:

【中文标题】跨浏览器 Javascript XML 解析【英文标题】:Cross-Browser Javascript XML Parsing 【发布时间】:2011-12-18 11:35:43 【问题描述】:

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

【问题讨论】:

看***.com/questions/649614/xml-parsing-in-javascript 这不是***.com/questions/649614/…的副本吗? This question 是对跨平台 XML 解析器的最早请求,但由于它要求场外资源(就像这个问题一样),所以它因离题而被关闭。 【参考方案1】:

以下内容适用于所有主流浏览器,包括 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") @GotDibbs:真的吗?上面的示例在 IE 9 标准中对我来说很好。 是的。不确定这里是否有其他设置阻碍,但是当我进入开发工具栏并将浏览器模式切换到 IE9 并将文档模式切换到 IE9 标准时,它会在没有额外检查的情况下爆炸。 @GotDibbs:我知道已经有一段时间了,但这里有一个 jsFiddle,在 IE 9 标准模式下对我来说很好用:jsfiddle.net/3s7Ly/1 @TimDown:如果它是一个工作版本,您介意将其编辑到您的答案中吗?【参考方案2】:

考虑使用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.parseXml 可能非常慢。我建议查看@TimDown 的帖子 也许是一年前的事了,但是查看 jQuery (code.jquery.com/jquery-1.9.1.js) 的源代码,我看不出与 TimDown 的答案有什么不同(省略了一些错误处理逻辑)。跨度> @Zotov 我已内联您的评论(帖子被正确地认为是仅链接,您的评论看起来值得内联而不是删除帖子)。【参考方案3】:

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

【讨论】:

以上是关于跨浏览器 Javascript XML 解析的主要内容,如果未能解决你的问题,请参考以下文章

生成跨浏览器的Javascript的DomDocument对象。

如何向 Google Site Search XML API 发出跨域浏览器请求?

第18章 JavaScript 与 XML

JAVA解决前端跨域问题。

JavaScript学习总结——AJAX延迟对象跨域模板引擎

封装常用的Javascript跨浏览器方法