Edge 中的 Microsoft.XMLDOM XML 解析器抛出错误,字符串内容为 XML

Error thrown with Microsoft.XMLDOM XML Parser in Edge with XML string content

我在使用 Microsoft EDGE 中的 Microsoft.XMLDOM XML 解析器时遇到以下错误:

Script(1,1)

有时会显示 start tag does not match end tag。有时它会给出另一个错误。我希望我能提供实际的错误消息,但我远离 Windows 机器,这是我记忆中的内容。

完全相同的 XML 内容适用于 Firefox 和其他浏览器。谁能看到发生了什么事?这可能是一个简单的修复,但我又没有 Windows 电脑。

这是我的XML:

<s:RichText x="118" visible="true" y="238" text="Text" fontSize="58.73271028037384">
    <s:filters>
        <BorderStrokeFilter alpha="1" angle="45" blurX="3" blurY="3" color="#FFFFFF" distance="0" hideObject="false" inner="false" knockout="false" multiplier="6" quality="3" strength="30" weight="3" xmlns="library://ns.flexcapacitor.com/flex"/>
        <BorderStrokeFilter alpha="1" angle="45" blurX="3" blurY="3" color="#000000" distance="0" hideObject="false" inner="false" knockout="false" multiplier="6" quality="3" strength="30" weight="3" xmlns="library://ns.flexcapacitor.com/flex"/>
    </s:filters>
    <s:textFlow>
        <s:TextFlow whiteSpaceCollapse="preserve" version="3.0.0" xmlns:s="library://ns.adobe.com/flex/spark"><s:p><s:span s:fontWeight="bold">Here is some text</s:span></s:p></s:TextFlow>
    </s:textFlow>
</s:RichText>

这是我的验证方法:

function validateXML(txt) {

    // code for IE
    if (window.ActiveXObject) {
        var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(txt);

        if (xmlDoc.parseError.errorCode != 0) {
            txt = "Error Code: " + xmlDoc.parseError.errorCode + "\n";
            txt = txt + "Error Reason: " + xmlDoc.parseError.reason;
            txt = txt + "Error Line: " + xmlDoc.parseError.line;
            return txt;
        }
        else {
            return "No errors found";
        }
    }
    // Mozilla, Firefox, Opera, etc.
    else if (document.implementation.createDocument) {
        var parser = new DOMParser();
        var xmlDoc = parser.parseFromString(txt, "text/xml");

        if (xmlDoc.getElementsByTagName("parsererror").length > 0) {
            return xmlDoc.getElementsByTagName("parsererror")[0];
        }
        else {
            return "No errors found";
        }
    }
    else {
        return "Your browser does not support XML validation";
    }
}


var xml = '<s:RichText x="118"></s:RichText>';
var result = validateXML(xml);

有人可以 Windows 10 运行 这个吗?我创建了一个代码笔 here

我的其他代码中有错误导致了我遇到的错误,但我还发现当 Edge 或 IE 出现错误时,它们会在控制台中记录错误。

此外,从 IE 10 或 11 开始支持 DOMParser。解决方法是切换 if 语句条件来检查 Domparser

if (window.DOMParser || document.implementation.createDocument)

然后在 parse 方法周围放置一个 try catch 块。

不过,IE好像没有给出一行或一列的错误信息。我还没有能够广泛地测试它。

更新后的codepen可以测试:

function validateXML(txt) {


    // Mozilla, Firefox, Opera, newer IE and Edge, etc.
    if (document.implementation.createDocument) {
        console.log("Before creating domparser");
        var parser = new DOMParser();
        try {
            var xmlDoc = parser.parseFromString(txt, "text/xml");
        } catch(error) {
            console.log(error);
        };

        console.log("After DomParser instance. Errors: "+ xmlDoc.getElementsByTagName("parsererror").length);
        if (xmlDoc.getElementsByTagName("parsererror").length > 0) {
            return xmlDoc.getElementsByTagName("parsererror")[0];
        }
        else {
            return "No errors found";
        }
    }
    // code for older IE
    else if (window.ActiveXObject) {
        var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(txt);

        if (xmlDoc.parseError.errorCode != 0) {
            txt = "Error Code: " + xmlDoc.parseError.errorCode + "\n";
            txt = txt + "Error Reason: " + xmlDoc.parseError.reason;
            txt = txt + "Error Line: " + xmlDoc.parseError.line;
            console.log("I work in Windows IE");
            return txt;
        }
        else {
            return "No errors found";
        }
    }
    else {
        return "Your browser does not support XML validation";
    }
}


var xml = '<s:RichText x="118" xmlns:s="f">test</f/></s:RichText>';
var result = validateXML(xml);
console.log(result); 
if (typeof result == "string") {
  document.body.innerHTML = "<pre>"+result+"</pre>";
}
else {
  document.body.innerHTML = "<pre>"+result.outerHTML+"</pre>";
}