MSXML: Comment faire une demande IXMLDOMNode quelle version MSXML il vient?
-
16-09-2019 - |
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 ...
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;