你有没有尝试过这样的事情?
xmlhttp.responseXML.resolveExternals = true;
xmlhttp.responseXML.setProperty("ProhibitDTD", false);
唯一的问题是该解决方案可能仅适用于 MSXML XMLHTTP ActiveX 对象。
编辑:这是一个带有 IE9 的具体示例:
var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.6.0");
// var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "sample.xml", false);
xmlhttp.responseXML.async = false;
xmlhttp.responseXML.resolveExternals = true;
xmlhttp.responseXML.validateOnParse = false;
xmlhttp.responseXML.setProperty("ProhibitDTD", false);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readystate == 4 && xmlhttp.status == 200) {
alert(xmlhttp.responseXML.xml);
}
}
xmlhttp.send();
示例.xml
<!DOCTYPE data SYSTEM "sample.dtd"><data>&ent;</data>
样本.dtd
<!ENTITY ent "Hello world!">
如果您使用 IE9 运行上述 cod,您将成功解析实体。但是,如果您切换到注释掉的 XMLHttpRequest,您将失败。
PS:我以为你说的是 IE 里面的脚本,还有一个叫做 XMLHttpRequest 的 Trident 原生组件,它与 XmlHttp ActiveX 组件有很大的不同。但是,如果您指的是驻留在 MSXML6.DLL 中的 IXMLHttpRequest COM 接口,您可以轻松地将上述代码转换为 C++。