MSXML:Как спросить IXMLDOMNode, из какой версии MSXML он взят?

StackOverflow https://stackoverflow.com/questions/1477559

Вопрос

Как я могу спросить, какая версия 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top