【问题标题】:MSXML 6, User/PW Auth, ResolveExternalsMSXML 6、用户/密码验证、ResolveExternals
【发布时间】:2011-07-21 04:35:45
【问题描述】:

据我所知,如果必须从受用户/密码保护的 URL 加载和解析 XML 资源,则不能只使用 MSXML DOM.Load()。没有地方可以指定凭据。

但是,如果您使用 XMLHTTPRequest 获取资源并将其解析为 DOM(通过其 .responseXML 属性),您将无法为 .resolveExternals 属性指定值。

当您使用默认为 True 的 MSXML 3、4(甚至 5)时,这或多或少可以解决问题,但是在 MSXML 6 中,它默认为 False:

resolveExternals Property:

在 MSXML 3.0、MSXML 4.0 和 MSXML 5.0 中,默认的 resolveExternals 值为真。在 MSXML 6.0 中,默认设置为 False。

如果此属性设置为 False,则没有外部包含和导入 会解决的。

有没有我看不到的解决方法?通常我需要解决外部问题,尤其是在处理 XSD 或 WSDL 时。

还是我在自欺欺人,也许 .resolveExternals 在使用 XMLHTTPRequest(仅 DOM.Load() 调用)时从不适用?

【问题讨论】:

    标签: msxml msxml6


    【解决方案1】:

    你尝试过这样的事情吗?

    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>
    

    sample.dtd

    <!ENTITY ent "Hello world!">
    

    如果您使用 IE9 运行上述 cod,您将成功解析实体。但是,如果切换到注释掉的 XMLHttpRequest,就会失败。

    PS:我以为你说的是​​ IE 中的脚本,并且有一个名为 XMLHttpRequest 的 Trident 原生组件,它与 XmlHttp ActiveX 组件完全不同。但是,如果您指的是驻留在 MSXML6.DLL 中的 IXMLHttpRequest COM 接口,您可以轻松地将上述代码转换为 C++。

    【讨论】:

    • 您称之为“MSXML XMLHTTP ActiveX 对象”的东西与 XMLHTTPRequest 相同,我认为您将其 ProgId 与其类名混淆了。据我所知,在实际执行 .send 之前,您不能在其 .responseXML 上设置属性,而且我认为 (A) 为时已晚,并且 (B) 如果它在 .send 之后起作用,它可能会再次无法使用凭据。
    • 嗨,鲍勃,我已经用一个工作示例编辑了答案。让我知道这是否适合您。
    • 是的,我意识到 Trident 后来添加了自己的(IE7?)。抱歉,我对此不太清楚。它似乎没有任何效果,但我会更彻底地检查。如果您的事件处理程序正在工作,其余的也应该是。谢谢。
    • 一个提示是 onreadystatechange 事件是 C++ 中的 IDispatch*,而不是传统的 COM 连接点。 ookii.org/post/… 有一个工作样本。
    • 是的,我知道这个问题。我认为这是故意这样做的,因为 JavaScript 的“事件绑定”。我更担心只读 .responseXML 对象可能是在 .send() 之后创建的。
    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2020-12-06
    • 2018-05-26
    • 2013-12-26
    • 2013-08-15
    相关资源
    最近更新 更多