MSXML: Wie eine IXMLDOMNode fragen, welche Version MSXML es herkommt?
-
16-09-2019 - |
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 ...
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;