문제

MSXML의 버전을 어떻게 물어볼 수 있습니까? ixmldomDocument2 이다? 주어진 ixmldomDocument2 같은 버전의 다른 문서를 만들어야합니다.

MSXML의 다른 버전에서 ixmldomDocument를 제공하면 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 MSXML에서 Microsoft의 버전 종속성으로 인해 버전 3에서 나온 것입니다. 이로 인해 발생합니다

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