如何以跨浏览器的方式测试一个对象是否为XML文档

6

为了进行单元测试,我希望能够检查特定的返回对象是否为XML文档。最好的方法是什么?

目前我只是测试了 doc.implementation (首先想到的第一个DOM属性),但有没有更好的方法?此外,有没有一种简便的方法来区分XML文档和HTML文档?


doc.doctype 是 doctype 节点。doctype 节点应该是 XHTML 而不是 html。 - Raynos
我的文档不是XHTML格式,因此它们没有文档类型。但还是谢谢你的提示。 - hugomg
3个回答

3

我建议参考jQuery.isXMLDoc的实现思路。事实证明,代码本身在Sizzle库中,这里

Sizzle.isXML = function( elem ) {
    // documentElement is verified for cases where it doesn't yet exist
    // (such as loading iframes in IE - #4833) 
    var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;

    return documentElement ? documentElement.nodeName !== "HTML" : false;
};

1
function isXML(xmlStr){
  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 {
    return false;
  }

  try {
    parseXml(xmlStr);
  } catch (e) {
    return false;
  }
  return true;      
}

很遗憾,它不再起作用了。 DOMParser不会抛出异常。 它只是返回一个带有错误描述的XML树。也许将来会改变/修复。 https://developer.mozilla.org/en-US/docs/Web/API/DOMParser https://bugzilla.mozilla.org/show_bug.cgi?id=45566 - Andrey Putilov
这是一个可能的解决方案,检查输出中的“parseerror”节点。 - Andrey Putilov

0

我假设你目前正在进行类似于http://www.javascriptkit.com/dhtmltutors/getxml3.shtml的实现。

如果是这样,我知道这不太好看,但你能不能简单地用try/catch包装它呢?或者,你需要知道它是否是XML而不是其他类型。如果是这种情况,除非进行一些其他断言,否则我不确定你能否判断。使用try catch至少可以让你从对象中创建一个XML文档,而不会将错误抛出到屏幕上。然后你可以假设,如果它加载到DOM中,那么它就是有效的XML。


这是编写“单元测试”所需的。我需要能够检查一个应该返回 XML 文档的特定函数是否确实如此。 - hugomg

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