MSXML:Как спросить IXMLDOMNode, из какой версии MSXML он взят?
-
16-09-2019 - |
Вопрос
Как я могу спросить, какая версия MSXML Документ IXMLDOMDocument2 есть?Учитывая Документ IXMLDOMDocument2 мне нужно создать другой документ той же версии.
Если вы предоставите IXMLDOMDocument из разных версий MSXML, вы получите исключение из msxml:
Смешивание объектов из разных версий MSXML является ошибкой.
Microsoft внутренне может спросить интерфейс, из какой версии MSXML он взят, мне нужен доступ к тому же самому.
Рассмотрим следующую гипотетическую функцию, написанную в псевдокоде:
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);
}
Проблема в том, что если IXMLDOMNode исходит, скажем MSXML6.Созданный DOMDocument
исходит из версии 3 (из-за зависимости Microsoft от версии в MSXML).Это приведет к
xml.transformNode()
чтобы создать исключение COM:
It is an error to mix objects from different versions of MSXML.
Поскольку Microsoft может спросить интерфейс, из какой версии MSXML он взят, я должен быть в состоянии сделать то же самое, но как?
Альтернативно, учитывая IXMLDOMNode
, как я могу построить XMLDOMDocument
объект той же версии...
Решение
я нашел ответ (который работает, по крайней мере, для MSXML версии 6.0).
Тип интерфейса:
DOMDocument60
спускается с IXMLDOMDocument30
, в то время как большинство людей используют IXMLDOMDocument или IXMLDOMDocument2.
Таким образом, если переданный интерфейс, по крайней мере, не поддерживает IXMLDOMDocument3, то я знаю, что объект, по крайней мере, не версии 6:
procedure DoStuff(doc: IXMLDOMdocument2);
begin
if not (doc is IXMLDOMDocument3) then
raise Exception.Create('badness');
...
end;
Или альтернативно:
procedure DoStuff(doc: IXMLDocument2);
begin
if not (doc is DOMDocument6) then
begin
DoStuffLegacyImplementation(doc);
Exit;
end;
//Real implementation
...
end;