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 ...

¿Fue útil?

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top