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

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top