1

IXMLDOMDocument2がどのバージョンの MSXML であるかを確認するにはどうすればよいですか? IXMLDOMDocument2を指定すると、同じバージョンの別のドキュメントを作成する必要があります。

異なるバージョンの MSXML から IXMLDOMDocument を指定すると、msxml から例外が発生します。

異なるバージョンの MSXML のオブジェクトを混在させるとエラーになります。

Microsoft は内部的に、それがどのバージョンの 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 からです (MSXML における Microsoft のバージョン依存のため)。これにより、

xml.transformNode()

COM 例外をスローするには:

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

Microsoft はインターフェイスにそれがどのバージョンの MSXML から来たかを尋ねることができるので、私は同じことを行うことができるはずですが、どうすればよいでしょうか?

または、指定された場合、同じバージョンのオブジェクトをIXMLDOMNode作成するにはどうすればよいですか...XMLDOMDocument

4

1 に答える 1

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;
于 2010-05-11T17:46:18.160 に答える