MSXML: Como pedir um IXMLDOMNode o MSXML versão vem?
-
16-09-2019 - |
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 ...
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;