在IE中,ParseFromString会抛出错误,但在Chrome中不会。

6

我正在使用一个适用于leaflet的KML插件,它在Google Chrome中运行良好。然而,在IE浏览器中,以下代码会抛出一个错误。

parser=new DOMParser();
console.log(url) // outputs: "path/to/kmlfile.kml" in Chrome debugger
url=parser.parseFromString(url,"text/xml"); //This line throws a parser error in IE 11, but is fine in Chrome

似乎在这段代码中有一个错误 - 作者应该传递实际的XML字符串,而不仅仅是XML文档的URL给parser.parseFromString()函数。这个解析器会出现错误是有道理的,因为文件路径不是有效的XML文件(注意:kml文件只是XML)。然而,在Chrome调试工具中不会抛出任何错误,这真的很奇怪。
我认为这两种情况都应该失败。可靠的MDN DOMParser文档中没有提到将URL作为parseFromString()参数的内容。所以我的问题是为什么在Chrome中可以工作,但在IE中会抛出错误,然后我该怎么做才能修复它?
请注意,这个问题与以下URL不同,因为这不是一个一般性的错误 - 这是关于在Chrome中正常工作但在IE中失败的问题:Internet Explorer 11 (IE 11) Throws Syntax Error using parseFromString in DOMParser
1个回答

7
当XML格式不正确时,非微软浏览器(如Firefox,Chrome等)会创建具有错误消息作为其内容的XML文档。单击此处(<-- 点击这里)。
当XML在Microsoft浏览器(IE和Edge)中格式不正确时,它会抛出一个错误,将错误写入控制台并停止你的脚本。请注意,我使用的是Mac,因此已经远程测试过了,但还没有机会亲自测试它。你可以将该代码放在try catch块中以适应IE,但我的意思是我不知道那是否会阻止它向控制台输出消息。
这里是code pen,其中包含故意格式不正确的XML,并且将错误消息写入输出内容。Codepen或输出中没有错误。我故意将来自解析器的错误代码写入输出窗口。打开控制台以查看发生了什么。
顺便说一句,在我看来,IE是正确的行为方式。不抛出错误直到相对较近才成为Internet的做事方式。不抛出错误的问题在于你不知道自己犯了什么错误或者在哪里犯了错误。Write once, debug everything。
此外,直到更近期的版本,IE使用ActiveX解析XML文档。
来自W3C XML 验证脚本:
function validateXML(text) {
    var message;
    var parser;
    var xmlDoc;

    // code for Edge, IE, Mozilla, Firefox, Opera, etc.
    if (document.implementation.createDocument || window.DOMParser) {
        parser = new DOMParser();

        try {
            xmlDoc = parser.parseFromString(text, "text/xml");
        }
        catch (error) {

        }

        if (xmlDoc.getElementsByTagName("parsererror").length > 0) {
            return xmlDoc.getElementsByTagName("parsererror")[0];
        }
        else {
            return "No errors found";
        }
    }
    // code for older versions of IE
    else if (window.ActiveXObject) {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";

        try {
            xmlDoc.loadXML(text);
        }
        catch (error) {

        }

        if (xmlDoc.parseError.errorCode != 0) {
            message = "Error Code: " + xmlDoc.parseError.errorCode + "\\n";
            message = message + "Error Reason: " + xmlDoc.parseError.reason;
            message = message + "Error Line: " + xmlDoc.parseError.line;
            return message;
        }
        else {
            return "No errors found";
        }
    }

    else {
        return "Not supported";
    }
}

Related question.


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