我应该使用哪个版本的 MSXML?

Posted

技术标签:

【中文标题】我应该使用哪个版本的 MSXML?【英文标题】:Which version of MSXML should I use? 【发布时间】: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 here。 Can be redisributed。

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

【问题讨论】:

【参考方案1】:

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

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

见:

List of Microsoft XML Parser (MSXML) versions Using the right version of MSXML in Internet Explorer

【讨论】:

所以正确的答案对我来说,看到我没有在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 属性,看看它们是否适用于您的使用。

【讨论】:

按版本号向后工作通常是个坏主意。如果 MSXML6 不可用,则 MSXML3 通常是最好的后备方案。这取自微软官方文档:msdn.microsoft.com/en-us/data/bb291077.aspx【参考方案3】:

Here's a list of all the versions。对differences on Wikipedia 进行了不错的讨论。

【讨论】:

【参考方案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。

【讨论】:

以上是关于我应该使用哪个版本的 MSXML?的主要内容,如果未能解决你的问题,请参考以下文章

office安装提示需要MSXML版本6.10.1129.0怎么办

如何安装MSXML4.0

Office2010安装需要MSXML版本6.10.1129.0的方法

fatal error C1083: 无法打开类型库文件: “msxml4.dll”

安装Office2010提示需要MSXML版本6.10.1129.0该怎么办

安装Office2010提示需要MSXML版本6.10.1129.0该怎么办