【问题标题】:Which version of MSXML should I use?我应该使用哪个版本的 MSXML?
【发布时间】:2010-10-31 09:50:08
【问题描述】:

这似乎是一个常见问题,尽管我在 SO 上找不到它。

我应该在我的应用程序中使用哪个版本的 MSXML,更重要的是,我应该如何决定?

有 MSXML3、4、5 和 6。

我最近在calling-wcf-service-by-vbscript 中发布了一些使用MSXML v4 的代码。 AnthonyWJones 发布说我不应该使用 4,而是使用 3 或 6,但可能是 3。当然不是 v5!

为什么?我想详细了解选择要在我的应用中使用的 MSXML 版本的标准。

额外问题:有人总结了不同版本的 MSXML 之间的差异吗?


到目前为止的总结:

  • MSXML6
    应该是首选。于 2006 年发布,包括性能和合规性修复。如果可以,请使用它。很好。没有合并模块;将 MSXML6 运行时与您的应用程序捆绑在一起,MS suggests packaging the MSXML6 msi file。 MSXML6 是 MSXML3/4 的升级版,但不会取代它们,因为它停止了一些功能。您可以获得微星here
  • MSXML3
    第二选择。部署最广泛的版本。最初于 2000 年 3 月发货。积极维护,没有新功能。当前受支持,如果您使用的是 SP5(2005 年发布)或更高版本。 SP7 是最新的(也来自 2005 年)。
  • MSXML5
    仅作为 MS-Office 的一部分发布。目前受 Microsoft 支持,但仅作为 Office 的一部分,不适用于构建应用程序。不要构建依赖于 MSXML5:Verboten 的应用程序。
  • MSXML4
    原来发货?目前处于“维护模式”。 Microsoft 鼓励人们从 MSXML4 迁移到 MSXML6。当前支持,如果您使用的是 2003 年发布的 MSXML4SP2 或更高版本。下载 MSXML4SP2 hereCan be redisributed

Using the right version of MSXML in Internet Explorerthe blog from Microsoft's xmlteam 上的一个很好的条目。

【问题讨论】:

    标签: windows visual-c++ com scripting msxml


    【解决方案1】:

    如果您需要支持 Win2k 之前的 Windows 操作系统版本,请使用 MSXML3。否则,请使用 MSXML6。

    MSXML4 处于维护模式。
    MSXML5 从未真正支持在 MS-Office 之外使用。

    见:

    【讨论】:

    • 所以正确的答案对我来说,看到我没有在Win98甚至win2000上部署任何东西,是MSXML6。
    • 请注意,如果您在 Windows 8.1 64 位中使用 MSXML6,您可能需要在代码中限定版本号(我没有,它会抛出未定义的引用错误),例如:@ 987654323@ 而不是 Dim XMLHttpReq As MSXML2.XMLHTTP。如果要传递参数,请使用XMLHttpReq As XMLHTTP60 而不是XMLHttpReq As XMLHTTP
    • 我已经有一段时间没有使用这个了......但是 IIRC,MSXML2.XMLHTTP 从未指向 MSXML6 - 你会得到一个旧版本(可能是 3)。由于 6 有很多重大更改,因此您需要明确请求它(因为那时您可能会在发布之前针对它测试您的代码)。
    【解决方案2】:

    几年前我不得不在工作中做出同样的决定。

    MSDN states 版本 6 是最适合使用的版本,但是它们不提供 SDK 中的合并模块,并且您不能像使用版本 4 一样在应用程序中分发它。版本 4 已被取代第 6 版和第 5 版专门用于 MS Office。版本 3 仍然是旧机器上的目标版本。

    我最终采取了一种优雅的降级方法,并尝试先使用 6,然后使用版本 4 失败,然后使用版本 3 失败(代码是 C++):

    inline bool CXMLDocument::CreateXMLDOMFactory(void)
    {
        wxMutexLocker lock(sm_mXMLDOMFactory);
    
        if(!sm_pXMLDOMFactory)
        {
            ::CoGetClassObject(CLSID_DOMDocument60, CLSCTX_ALL, 0, IID_IClassFactory, reinterpret_cast<void **>(&sm_pXMLDOMFactory));
            if(!sm_pXMLDOMFactory)
            {
                ::CoGetClassObject(CLSID_DOMDocument40, CLSCTX_ALL, 0, IID_IClassFactory, reinterpret_cast<void **>(&sm_pXMLDOMFactory));
                if(!sm_pXMLDOMFactory)
                    ::CoGetClassObject(CLSID_DOMDocument30, CLSCTX_ALL, 0, IID_IClassFactory, reinterpret_cast<void **>(&sm_pXMLDOMFactory));
            }
        }
    
        return sm_pXMLDOMFactory != 0;
    }
    

    我们注意到从第 4 版迁移到第 6 版后性能得到了显着提升,尽管您必须在文档上显式设置 NewParser 属性才能获得此好处,例如:

    pDocument->setProperty(_bstr_t(L"NewParser"), VARIANT_TRUE);
    

    出于安全考虑、远程 DTD 等原因,在加载文档时还需要跳过更多的环节。同样,这是通过文档上的属性完成的,因此值得在 MSDN 中查找 ProhibitDTDUseInlineSchemaAllowXsltScriptServerHTTPRequest 属性,看看它们是否适用于您的使用。

    【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      似乎 MSXML 5 是唯一能够对 XML 进行数字签名的版本。 MS网站说连MSXML 6都做不到,如果你需要这个功能,似乎MSXML 5是唯一的出路。

      http://msdn.microsoft.com/en-us/library/ms761363(VS.85).aspx "此示例代码使用在 Microsoft Office 应用程序的 MSXML 5.0 中实现的功能。MXSML 6.0 及更高版本不支持 XML 数字签名"

      【讨论】:

        【解决方案5】:

        我最近创建了一个 JS 库,它试图从最新版本优雅地降级到最旧版本。我发现大多数系统都很好地支持 MSXML 3.0。我曾想在可用时使用 v. 6.0,但它在某些 IE 8 安装上崩溃了。所以,我不得不更改我的代码,先尝试 v 3.0,然后尝试 v 6.0,然后再尝试 v 2.0。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-09
          • 2010-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多