MSXML: Come chiedere ad un IXMLDOMNode cosa MSXML versione viene?
-
16-09-2019 - |
Domanda
Come posso chiedere quale versione di MSXML un IXMLDOMDocument2 è? Dato un IXMLDOMDocument2 Ho bisogno di creare un altro documento della stessa versione.
Se si dà un IXMLDOMDocument da diverse versioni di MSXML, si otterrà una deroga msxml:
E 'un errore di mescolare oggetti provenienti da diverse versioni di MSXML.
Microsoft internamente può richiedere un'interfaccia quale versione di MSXML è venuto, ho bisogno di accesso alla stessa cosa.
Si consideri il seguente ipotetica funzione scritta in pseudo-codice:
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);
}
Il problema è che se viene da IXMLDOMNode, dire MSXML6 . Il DOMDocument
creata è dalla versione 3 (a causa della versione di Microsoft dependance in MSXML). Questo farà sì che la
xml.transformNode()
per un'eccezione COM:
It is an error to mix objects from different versions of MSXML.
Dal momento che Microsoft è in grado di chiedere un'interfaccia che versione di MSXML è venuto, dovrei essere in grado di fare la stessa cosa, ma come?
Alternativly, dato un IXMLDOMNode
, come posso costruire un oggetto XMLDOMDocument
della stessa versione ...
Soluzione
ho capito una risposta (che lavora per MSXML versione 6.0 almeno).
Il tipo di interfaccia:
DOMDocument60
scende dal IXMLDOMDocument30
, mentre la maggior parte delle persone usano IXMLDOMDocument o IXMLDOMDocument2.
Quindi, se l'interfaccia passato non supporta almeno IXMLDOMDocument3, quindi so che l'oggetto non è almeno la versione 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;