2009-09-25 7 views
1

Как я могу спросить, какая версия MSXML IXMLDOMDocument2 есть? Учитывая IXMLDOMDocument2 Мне нужно создать другой документ той же версии.MSXML: Как спросить IXMLDOMNode, из какой версии MSXML он приходит?

Если вы даете 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 он пришел, я должен быть в состоянии сделать то же самое, но как?

Alternativly, дается IXMLDOMNode, как я могу построить XMLDOMDocument объект той же версии ...

ответ

0

я понял, ответ (который работает для 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; 

Или Alternativly:

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

    //Real implementation 
    ... 
end;