Frage

Wie kann ich fragen, welche Version von MSXML ein IXMLDOMDocument2 ist? Bei einem gegebenen IXMLDOMDocument2 Ich brauche ein anderes Dokument der gleichen Version erstellen.

Wenn Sie eine IXMLDOMDocument aus verschiedenen Versionen von MSXML geben, erhalten Sie eine Ausnahme von msxml erhalten:

  

Es ist ein Fehler Objekte aus verschiedenen Versionen von MSXML zu mischen.

Microsoft intern kann eine Schnittstelle fragen, welche Version von MSXML es herkam, ich brauche Zugriff auf die gleiche Sache.


Sie sich die folgende hypothetische Funktion geschrieben in Pseudo-Code:

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);     
}

Das Problem ist, dass, wenn IXMLDOMNode herkommt, sagen MSXML6 . Die erstellte DOMDocument ist ab der Version 3 (wegen der Microsoft-Version dependance in MSXML). Dies bewirkt, dass die

xml.transformNode()

eine COM-Ausnahme werfen:

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

Da Microsoft in der Lage ist, eine Schnittstelle zu fragen, welche Version von MSXML es kam, soll ich in der Lage sein, das Gleiche zu tun, aber wie?

Alternativly, da ein IXMLDOMNode, wie kann ich ein XMLDOMDocument Objekt der gleichen Version konstruieren ...

War es hilfreich?

Lösung

dachte ich, eine Antwort aus.

(die für MSXML Version 6.0 mindestens arbeitet)

Der Schnittstellentyp:

DOMDocument60

stammt von IXMLDOMDocument30, während die meisten Menschen IXMLDOMDocument oder IXMLDOMDocument2 verwenden.

Also, wenn die übergebene Schnittstelle zumindest nicht IXMLDOMDocument3 unterstützen, dann weiß ich, das Objekt nicht mindestens Version 6:

procedure DoStuff(doc: IXMLDOMdocument2);
begin
   if not (doc is IXMLDOMDocument3) then
       raise Exception.Create('badness');

   ...
end;

oder alternativly:

procedure DoStuff(doc: IXMLDocument2);
begin
   if not (doc is DOMDocument6) then
   begin
      DoStuffLegacyImplementation(doc);
      Exit;
   end;

   //Real implementation
   ...
end;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top