MSXML:如何询问IXMLDOMNode它来自哪个版本的MSXML?

时间:2009-09-25 14:18:01

标签: versioning msxml winsxs msxml6

我怎么知道 IXMLDOMDocument2 是什么版本的MSXML?鉴于 IXMLDOMDocument2 ,我需要创建相同版本的另一个文档。

如果从不同版本的MSXML中提供IXMLDOMDocument,则会从msxml中获得异常:

  

混合来自不同版本的MSXML的对象是错误的。

微软内部可以向界面询问它来自哪个版本的MSXML,我需要访问同样的东西。


考虑以伪代码编写的以下假设函数:

String XMLTransform(IXMLDOMNode xml, String xsl)
{
    //Create a document to hold the xml
    IXMLDOMDocument2 xslDocument = new CoDOMDocument();

    //load the xsl string into the xsl dom document
    xslDocument.loadXML(xsl);

    //transform the xml
    return xml.transformNode(xslDocument);     
}

问题是,如果来自IXMLDOMNode,请说 MSXML6 。创建的DOMDocument来自版本3(因为Microsoft的版本依赖于MSXML)。这将导致

xml.transformNode()

抛出COM异常:

It is an error to mix objects from different versions of MSXML.

由于微软可以向界面询问它来自哪个版本的MSXML,我应该能够做同样的事情,但是怎么做?

另外,给定IXMLDOMNode,我如何构建同一版本的XMLDOMDocument对象...

1 个答案:

答案 0 :(得分:0)

我找到了答案(至少适用于MSXML 6.0版)。

界面类型:

DOMDocument60

来自IXMLDOMDocument30,而大多数人使用IXMLDOMDocument或IXMLDOMDocument2。

因此,如果传递的接口至少不支持IXMLDOMDocument3,那么我知道该对象至少不是版本6:

procedure DoStuff(doc: IXMLDOMdocument2);
begin
   if not (doc is IXMLDOMDocument3) then
       raise Exception.Create('badness');

   ...
end;

或者替代地:

procedure DoStuff(doc: IXMLDocument2);
begin
   if not (doc is DOMDocument6) then
   begin
      DoStuffLegacyImplementation(doc);
      Exit;
   end;

   //Real implementation
   ...
end;