Pergunta

Como posso perguntar o que versão do MSXML um IXMLDOMDocument2 é? Dado um IXMLDOMDocument2 eu preciso para criar um outro documento da mesma versão.

Se você der uma IXMLDOMDocument de diferentes versões do MSXML, você receberá uma exceção de msxml:

É um erro misturar objetos de diferentes versões do MSXML.

Microsoft internamente pode pedir uma interface que versão do MSXML veio, eu preciso de acesso ao mesmo.


Considere a seguinte função hipotético escrito em 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);     
}

O problema é que, se IXMLDOMNode vem, dizem MSXML6 . O DOMDocument criado é da versão 3 (por causa da versão dependência da Microsoft em MSXML). Isso fará com que o

xml.transformNode()

para lançar uma exceção COM:

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

Desde que a Microsoft é capaz de pedir uma interface que versão do MSXML veio, eu deveria ser capaz de fazer a mesma coisa, mas como?

Alternativly, dado um IXMLDOMNode, como posso construir um objeto XMLDOMDocument da mesma versão ...

Foi útil?

Solução

Eu descobri uma resposta (que funciona para MSXML versão 6.0 pelo menos).

O tipo de interface:

DOMDocument60

desce do IXMLDOMDocument30, enquanto a maioria das pessoas usam IXMLDOMDocument ou IXMLDOMDocument2.

Portanto, se a interface passado não pelo menos o apoio IXMLDOMDocument3, então eu sei que o objeto não é, pelo menos, a versão 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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top