Question

Comment puis-je demander à quelle version de MSXML IXMLDOMDocument2 est? Compte tenu de IXMLDOMDocument2 Je dois créer un autre document de la même version.

Si vous donnez un IXMLDOMDocument de différentes versions de MSXML, vous obtiendrez une exception de MSXML:

  

Il est une erreur de mélanger des objets de différentes versions de MSXML.

Microsoft peut demander à une interface interne quelle version de MSXML il est venu, je besoin d'accéder à la même chose.


Considérons la fonction hypothétique suivante écrite en pseudo-code:

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);     
}

Le problème est que si IXMLDOMNode vient, par exemple MSXML6 . Le DOMDocument créé est de la version 3 (à cause de la dependance de version dans MSXML de Microsoft). Cela entraînera le

xml.transformNode()

pour lancer une exception COM:

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

Depuis que Microsoft est en mesure de demander une interface quelle version de MSXML il est venu, je devrais être en mesure de faire la même chose, mais comment?

Alternativly, étant donné un IXMLDOMNode, comment puis-je construire un objet XMLDOMDocument de la même version ...

Était-ce utile?

La solution

i compris à une réponse (qui fonctionne pour la version MSXML 6.0 au moins).

Le type d'interface:

DOMDocument60

descend de IXMLDOMDocument30, alors que la plupart des gens utilisent IXMLDOMDocument ou IXMLDOMDocument2.

Donc, si l'interface passé ne pas au moins soutenir IXMLDOMDocument3, alors je sais que l'objet est au moins la version 6:

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

   ...
end;

Ou alternativly:

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

   //Real implementation
   ...
end;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top