MSXML: ¿Cómo pedir a un IXMLDOMNode lo MSXML versión viene?
-
16-09-2019 - |
Pregunta
¿Cómo puedo preguntar qué versión de MSXML un IXMLDOMDocument2 es? Dado un IXMLDOMDocument2 i necesidad de crear otro documento de la misma versión.
Si das una IXMLDOMDocument de diferentes versiones de MSXML, obtendrá una excepción a msxml:
Es un error para mezclar objetos de diferentes versiones de MSXML.
Microsoft internamente puede pedir a un interfaz de la versión de MSXML viene, necesito el acceso a la misma cosa.
Considere la siguiente función hipotético escrito en pseudo-código:
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);
}
El problema es que si IXMLDOMNode viene de, digamos MSXML6 . El DOMDocument
creado es de la versión 3 (a causa de la dependencia versión de Microsoft en MSXML). Esto hará que el
xml.transformNode()
para lanzar una excepción COM:
It is an error to mix objects from different versions of MSXML.
Desde que Microsoft es capaz de pedir una interfaz de qué versión de MSXML viene, yo debería ser capaz de hacer lo mismo, pero ¿cómo?
Alternativly, dada una IXMLDOMNode
, ¿Cómo puedo construir un objeto XMLDOMDocument
de la misma versión ...
Solución
Me di cuenta de una respuesta (que funciona para MSXML versión 6.0 como mínimo).
El tipo de interfaz:
DOMDocument60
desciende de IXMLDOMDocument30
, mientras que la mayoría de la gente usa IXMLDOMDocument o IXMLDOMDocument2.
Así que si la interfaz no pasó al menos apoyar IXMLDOMDocument3, entonces sé que el objeto no es, al menos, la versión 6:
procedure DoStuff(doc: IXMLDOMdocument2);
begin
if not (doc is IXMLDOMDocument3) then
raise Exception.Create('badness');
...
end;
O Alternativly:
procedure DoStuff(doc: IXMLDocument2);
begin
if not (doc is DOMDocument6) then
begin
DoStuffLegacyImplementation(doc);
Exit;
end;
//Real implementation
...
end;