في العام الماضي ، قضيت الكثير من الوقت في محاولة لتطوير تطبيق الويب المستند إلى XML مع Delphi. كانت الفكرة الأولية جميلة ، لكن النتيجة هي أن الأشياء كانت بسيطة للغاية. جزء من السبب هو أن تنفيذ ربط البيانات بين XML والكائن أمر مزعج للغاية (الجزء الآخر هو أنه ليس على دراية بـ XSLT ويستغرق الكثير من الوقت لتعلمه).
لقد استخدمت دائمًا ربط بيانات XML التي توفرها Delphi. بالطبع ، إنه مريح للغاية بمجرد إنشاؤه في البرنامج. ولكن المشكلة هي أنه سيكون هناك دائمًا بعض التغييرات أثناء عملية تطوير البرنامج. مزعجة للغاية.
لذلك عندما أفكر في التعرف على مجموعة البيانات ، أعتقد على الفور أنه يمكنني أيضًا استخدام RTTI لتنفيذ إصرار XML للكائن - في الواقع ، فإن تطبيق SOAP الذي بدأ مع delphi6 هو استخدام RTTI لتنفيذ تحويل الكائن إلى بيانات الصابون ( هذا هو ، XML). من الواضح أنني تأخرت بالفعل العمل قبل بضع سنوات ، وسألته على الفور عن رمز المصدر. Lexlib هي مكتبة بها العديد من الوظائف التي تشبه مكتبة الفئة الأساسية لـ .NET (بالطبع ليست كبيرة ^O ^). لأنني بحاجة فقط إلى هذا الجزء ، ليست هناك حاجة لاستخدام هذه المكتبة بأكملها. ينجز:
TMXMLPersister = class (to -cject) إجراء الفئة العامة loadObjfromxml (anode: ixmlnode ؛ aobj: tperSentive) ، tkset ، tklstring ، tkwstring ، tkint64] ؛ (( AOBJ هو tmdatasetproxy) ثم (AOBJ كـ tmdatasetproxy) .LoadFromxml (anode) تبدأ plist: = tmproplist.create (AOBJ) ؛ ؛ anode.childnodes [wideString (pinfo^.name)] ، tmpobj كما pinfo^. ppropinfo ؛ pinfo: = plist.props [i] ؛ (TMPOBJ هو tperSentive)) ثم SaveObjToxml (anode.addchild (wideString (pinfo^.name)) ، tmpobj كما tpersistr. ^. name).
يجب القول أن هذا التنفيذ بسيط للغاية. هناك بشكل أساسي ثلاثة أجزاء (بنية الحمل والحفظ متشابهة):
أولاً ، تتم المعالجة الخاصة إلى TMDATASETPROXY وتوكل هذه الفئة للتعامل مع تنفيذها بنفسها. .
والثاني هو معالجة الفئة بشكل متكرر ، وبالطبع يدعم فقط الفئة المستمدة من tperSentive.
ثالثًا ، يتم تحويل الحقل العام ببساطة إلى سلسلة وحفظه ، والذي يقترض مرشح Lexlib ، ويقوم فقط بمعالجة أنواع البيانات التي يمكن تحويلها ببساطة إلى سلسلة ، وتصفية تلك الأنواع التي قد تسبب أخطاء التحويل.
للاطلاع على قائمة TMPROPLIST المستخدمة في الكود أعلاه ، راجع التنفيذ في "استخدام RTTI من Delphi لتنفيذ مجموعات البيانات".
فيما يلي ثبات XML لمجموعة البيانات التي تم تنفيذها باستخدام TMDATASETPROXY. إنه يزيل مشكلة استخدام TclientDataset ، ويستخدم طريقة تسجيل الحقول باستخدام العقدة. على الرغم من أن ملف XML الذي تم إنشاؤه بهذه الطريقة سيكون أكبر قليلاً ، إلا أن الفوائد واضحة أيضًا ، خاصةً XML التي أخطط لاستخدامها في تطبيقات الويب ، وسوف تكون التسجيل في العقدة أكثر ملاءمة عند استخدام XSLT.
الإجراءات TMDATASETPROXY.LOADFROMXM (anode: IXMLNODE) childnodes [j] ؛ [pinfo^. name) بينما تبدأ Foreach Prow: = anode.addchild ('row') ؛ ثم prow.addchild (wideString (pinfo^.name).فيما يلي عرض تجريبي بسيط يتضمن استمرار XML لمجموعة البيانات. لاحظ أنه عند التحميل ، يتم توصيل عضو الموظف بـ Adodataset2 ، وهو متصل بجدول يحتوي على هذه الحقول. بعد اكتمال الحمل ، سيتم نسخ محتويات هذه الحقول في جدول الموظف إلى هذا الجدول.
Tdemocompany = فئة (tpersistr tform1.saveclick (Sender: var demo: tdemocompany ؛ ؛ demo.employe: = nil ؛ جرب XMLDOCUMENT1. النص: = inttoStr (demo.code) ؛ subitems.add (demo.employ.lastname) ؛ .
أخيرًا ، أستطيع أن أقول وداعًا لربط بيانات XML المزعجة ، وليس عليّ كتابة XSD في المستقبل - على الرغم من وجود أدوات مفيدة ، من الأفضل توفير بعض المتاعب.