سؤال

كيف يمكنني أن أسأل عن إصدار MSXML ixmldomdocument2. يكون؟ بالنظر إلى ixmldomdocument2. أحتاج إلى إنشاء وثيقة أخرى من نفس الإصدار.

إذا قمت بإعطاء IXMLDOMDocument من إصدارات مختلفة من MSXML، فستحصل على استثناء من MSXML:

إنه خطأ في مزيج الكائنات من إصدارات مختلفة من MSXML.

مايكروسوفت يمكن أن يسأل داخليا واجهة ما هو إصدار 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()

لرمي استثناء كوم:

It is an error to mix objects from different versions of MSXML.

نظرا لأن Microsoft قادر على طرح واجهة ما إصدار MSXML الذي جاء منه، يجب أن أكون قادرا على فعل الشيء نفسه، ولكن كيف؟

بديل، بالنظر إلى IXMLDOMNode, ، كيف يمكنني بناء XMLDOMDocument كائن من نفس الإصدار ...

هل كانت مفيدة؟

المحلول

لقد اكتشفت إجابة (تعمل من أجل الإصدار 6.0 MSXML على الأقل).

نوع الواجهة:

DOMDocument60

ينزل من IXMLDOMDocument30, ، في حين أن معظم الناس يستخدمون ixmldomdocument أو ixmldomdocument2.

لذلك إذا كانت الواجهة المرة التي تم تمريرها لا تدعم IXMLDOMDOCDOMENT3 على الأقل، فأنا أعرف أن الكائن ليس على الأقل الإصدار 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