MSXML: كيف سؤال ixmldomnode ما إصدار MSXML الذي يأتي منه؟
-
16-09-2019 - |
سؤال
كيف يمكنني أن أسأل عن إصدار 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;