قائمة طعام
مجاني
التسجيل
الصفحة الرئيسية  /  مشاكل/ دليل الإنترنت - كل المرح على الشبكة. استخدام نموذج كائن مستند XML كيفية إنشاء ملف دلفي xml

دليل السفر عبر الإنترنت - كل المتعة على الويب. استخدام نموذج كائن مستند XML كيفية إنشاء ملف دلفي xml

اطلب حلاً لدلفي
تعد دلفي ثاني أهم لغة برمجة يتم تعريف الطلاب بها غالبًا في عملية التعلم. هذه بداية تعلم البرمجة الشيئية. كطالب ، توصلت إلى استنتاج مفاده أنه لا توجد طريقة أسهل لتعلم اللغة من كتابة آلة حاسبة فيها. حتى إذا قمت بتنفيذ دالة بدائية تتمثل في جمع رقمين ، فسوف يلقي ذلك الضوء كثيرًا.

CodeGaear و Delphi 7 و Lazarus عبارة عن مجمّعين مختلفين ، برامج ستنقل الكود الذي تكتبه إلى الجهاز وتحويله إلى واحد وآخر. هذه كلها برامج لإنشاء البرامج ، وليست لغات برمجة منفصلة. يستخدم هؤلاء المترجمون لغة برمجة Object Pascal ، وهي أساس لغة دلفي ، والتي تشبه في تركيبها لغة باسكال العادية ، ولكنها تختلف وظيفيًا بشكل كبير.

ما هي صيغة لغة البرمجة؟

هذا هو تنسيق كتابة عوامل مختلفة. على سبيل المثال ، تحتوي Pascal for loop على التنسيق التالي: من أجل n: = 1 to k do ، وهكذا.

في لغة البرمجة C ++ ، تتم كتابة نفس الحلقة بشكل مختلف قليلاً: لـ (n = 1 ؛ n نكتب آلة حاسبة

سيعطيك هذا فهمًا لكيفية تفاعل الكائنات مع رمز البرنامج ، وما هي "المتغيرات" وكيف تعمل الوظائف الرياضية. أي برمجة ستكون في أي حال عملية حسابية. اللعبة هي أيضًا برنامج يحسب شيئًا ما باستمرار ويعمل بالأرقام والوظائف العددية. البرمجة لا تنفصل عن الرياضيات.

دعونا نستخدم بيئة تطوير Lazarus في الكتابة. وظائفها ليست غنية مثل CodeGear ، على سبيل المثال ، لكنها متاحة مجانًا وهي مخصصة للتدريب.

فتح بيئة التطوير ، نرى النموذج وصندوق الأدوات. هنا النموذج.

هنا هو صندوق الأدوات.

أول شيء سنفعله هو إضافة العناصر الثلاثة التي نحتاجها لتنفيذ وظيفة جمع رقمين. نحتاج: "تديت" بكمية ثلاث قطع و "تيبوتون". في الصورة أدناه تظهر على اللوحة مع الأسهم. نضغط عليها مرة ، ثم مرة واحدة على النموذج ، وتظهر عليها.

هذه حقول نصية للإدخال وزر عادي. تصادف هذه العناصر باستخدام أي منها تقريبًا برنامج ويندوز... إلق نظرة.


الآن دعنا نمسح هذه التسميات. انقر فوق علامة التبويب "عرض". وانقر فوق العنصر "مفتش الكائن. ستظهر نافذة مثل هذه.

نقر مرة واحدة على عنصر "Button" الخاص بنا في النموذج وقم بتغيير قيمة "Caption" في نافذة المفتش إلى أي قيمة أخرى. على سبيل المثال ، كلمة "Ok". نضغط على Enter. نرى في النموذج كيف غيّر العنصر اسمه.

لنفعل الشيء نفسه مع تحرير ، فقط لا تعيد تسميتها ، ولكن اجعلها بدون أي محتوى. حددها بدورها وامسح قيمة النص في المفتش. لا تنس الضغط على Enter.

نتيجة لذلك ، يبدو شكلنا هكذا.


الآن ، لكي تعمل الآلة الحاسبة الخاصة بنا ، تحتاج إلى تسجيل ملف كود البرنامجلإجراء الزر لدينا. انقر فوق عنصر الزر مرتين وافتح محرر المصدر.

ارى؟ زر الإجراء 1 انقر. هذا هو الإجراء المسؤول عما يحدث عندما نضغط على الزر مرة واحدة. ويجب أن يحدث ما يلي: يحتاج البرنامج إلى عرض مجموع الأرقام التي تم إدخالها في أول حقلين في الحقل الثالث تحرير. نكتب الكود.

نحتاج إلى كتابة هذه الأسطر الخمسة البسيطة من التعليمات البرمجية. يمكن رؤية التعليقات والتفسيرات في الصورة أعلاه. بعد ذلك نضغط على هذا الزر.

سيتم تجميع مشروعنا. سيتم تجميعها في برنامج. نقوم بإدخال الأرقام في أول حقلين ، ونضغط على الزر ونحصل على قيمة المجموع.

استنتاج

يمكنك النقر فوق الزر "ملف" ، ثم "حفظ الكل" ، وتحديد مجلد لحفظه وسيكون لديك برنامج كامل يمكن تشغيله من سطح المكتب. حاول الآن أن تكتشف بنفسك ما تحتاج إلى إعادة كتابته في هذا الرمز بحيث يقسم البرنامج رقمين ، ولا يضيف. تلميح: تحتاج إلى تغيير نوع البيانات. يظهر الفيديو أدناه مثالًا مشابهًا ، ولكن في بيئة دلفي 7 ، وليس لعازر.

بالنسبة للعديد من مبرمجي دلفي ، يرتبط حفظ الإعدادات باستخدام INIملفات في برامجهم. تطبيق هذه الطريقة، في المشاريع الأكثر أو أقل خطورة ، يجب تجنبها ، لأن هذا يحد من المرونة ، مما يمنع المزيد من التوسع في البرنامج. يجب أن يقال أن هذا النهج شائع جدًا نظرًا لسهولة استخدامه ووجود أدوات مدمجة في بيئة التطوير.

ومع ذلك ، منظم XMLالملفات. ميزتها هي أن عدد المعلمات قد لا يكون ثابتًا. لفهم هذا بشكل أفضل ، فكر في مثال محدد.

في برنامج USearch ، عند النقر فوق أحد الإدخالات ، تظهر قائمة سياق يتم فيها عرض قائمة بالعناصر. هذه العناصر هي أوامر يتم تحميلها بدورها من ملف الإعدادات. في حالة تخزين الإعدادات في INIملف ، ثم يمكن للبرنامج حفظ وتحميل عدد معين من الأوامر ، على سبيل المثال 10 أو 50. بمجرد الحاجة إلى قيمة أكبر ، سيكون عليك إعادة كتابة الكود وإعادة تجميعه وفقًا لذلك.


تطبيق نهج باستخدام XMLمن الملفات ، سنكون قادرين على تحميل جميع معلمات القسم ديناميكيًا. بالإضافة إلى ذلك ، سيصبح ملف التكوين أكثر أناقة ، بدون ترقيم المعلمات الزائد. لكن، الوسائل القياسيةللعمل مع XMLلدى دلفي العديد من العيوب ، لذا أوصي باستخدام مكتبة قياسية MSXML... عادة ما يتم تضمينه بشكل افتراضي في أنظمة التشغيلعائلة Windows.


للاتصال MSXML، نحتاج إلى إنشاء ملف واجهة بقائمة بجميع الوظائف عن طريق استيراده من خادم COM. تمت كتابة العديد من المقالات التفصيلية حول كيفية استيراد الواجهة ، لكنني أقترح عليك تنزيل الملف MSXML2_TLB.PASجاهز للإستخدام. بعد تنزيل الملف ، ضعه بجوار مشروعك ، أو أسقطه في مجلد lib لبيئة دلفي. لذلك كل البرامج التي تم إنشاؤهاسوف تكون قادرة على استخدام الوحدة MSXML، تحتاج فقط إلى إضافة سطر MSXML2_TLB للاستخدامات.

للتوضيح ، ضع في اعتبارك المثال التالي لاستخدام هذه المكتبة:

بيانات تحميل الإجراء ؛ var XMLDoc: DOMDocument ؛ الجذر: IXMLDOMElement ؛ بدء XMLDoc: = CoDOMDocument.Create ؛ XMLDoc.Load ("Settins.xml") ؛ الجذر: = XMLDoc.DocumentElement ؛ ShowMessage (Root.SelectSingleNode ("الحجم / العرض"). نص) ؛ الجذر: = لا شيء ؛ XMLDoc: = لا شيء ؛ نهاية؛

أولاً ، يتم إنشاء مثيل لفئة DOMDocument ، ثم يتم تحميل محتويات ملف settings.xml في الذاكرة. منذ أي معيار XMLيجب أن يحتوي الملف على علامة الجذر (في هذه الحالة التكوين) ، ثم نحتاج إلى الحصول عليها باستخدام الوظيفة عنصر الوثيقة... ثم يتم عرض المحتوى بين العلامات. ، والتي هي بدورها بين العلامات ... وبالتالي ، من ملف settings.xml ، ستعرض طريقتنا النص في MessageBox "100 بكسل".

500 بكسل 100 بكسل

هنا يتم تطبيق طريقة SelectSingleNode ، والتي تأخذ سلسلة كمعامل

أهلا بك! هذه المدونة تدور حول الإنترنت وأجهزة الكمبيوتر ، أو بالأحرى كانت مخصصة لهم.

ربما ، من الواضح على الفور أنه لم تظهر مقالات جديدة على الموقع لسنوات عديدة. نعم ، هذا هو مصير معظم المدونات. كان هذا المشروع في يوم من الأيام مشروعًا طموحًا ، وكان للمؤلف ، مثل كثيرين آخرين ممن كتبوا في ذلك الوقت ، خططًا طموحة ليصبح أحد أفضل المدونين الروس. حسنًا ، إذا نظرت الآن ، فإن تلك المدونات التي تم إنشاؤها بالتزامن مع مدونتي ، قد اختفت بالفعل إلى الأبد. ولم يكن لدي الوقت الكافي للتدوين. لذا نعم ، لم يعد يتم تحديثه. على الرغم من أننا مع هذا الموقع فزنا في مسابقة "Blog of Runet 2011".

حتى أن لدي فكرة لحذف كل هذا ، ولكن بعد ذلك قمت بمراجعة المواد القديمة ، وأدركت أنه لا يزال من الممكن أن تكون مفيدة للقراء. نعم ، بعض المقالات قديمة (إذا كان لدي ما يكفي من القوة ، فستتلقى الملاحظات المناسبة) ، لكن الموقع ، على سبيل المثال ، يمكن أن يكون مفيدًا للمبتدئين - هنا يمكنك القراءة عنه مفاهيم أساسيةالإنترنت ، تعرف على كيفية تكوين الإنترنت أو Windows أو حتى تقرر التبديل إلى Linux. لذا انظر إلى القواعد واختر النموذج المناسب لك.

ومع ذلك ، آمل أن يكون هذا أكثر من مجرد مدونة ، ولكنه دليل حقيقي للإنترنت. يمكن عرض الموقع في وضع الدليل ، حيث يتم تنظيم جميع المقالات المتاحة حسب الفئة. ومن يدري ، ربما ستبدأ هنا يومًا ما مقالات جديدة عالية الجودة.

ساندر

Picodi.ru عبارة عن بوابة خصم من International Coupons ، وهو خبير بولندي في المدخرات والتسوق الرخيص. تعتبر البولنديون من أكثر الدول اقتصادا في العالم ، لذلك ليس من المستغرب أن يكون هذا النوع من المشاريع قد نشأ عن الشركة البولندية الناشئة kodyrabatowe.pl. كيف يمكن أن تكون هذه البوابة مفيدة لمستخدم الإنترنت العادي في روسيا؟

هواتف أندرويد الحديثة هي أكثر من مجرد هواتف. تعتاد على الكتابة البرامج المثبتة، إلى سجل المكالمات والرسائل النصية ، وجمع الصور والمزيد. لكن الوقت يمر ، ويبدأ الجهاز الذي يناسبك تمامًا في الإبطاء أو حدوث خلل أو ببساطة يفقد مظهره الجميل بسبب الرقائق الموجودة على العلبة أو الخدوش على الشاشة. السؤال الذي يطرح نفسه هو اختيار هاتف جديد وتغييره هاتف android... وإذا تجاوزنا الآن مسألة الاختيار ، فعندئذ "ننتقل" إلى هاتف جديدتظل مشكلة خطيرة - فأنت لا تريد مطلقًا بدء تشغيل جميع البيانات من البداية. هذا ما سنتحدث عنه اليوم.

معظم قراء هذه المدونة ، على الأرجح ، لم يواجهوا أبدًا أنظمة تحكم في الإصدار ولن يصادفوا أيًا منها في المستقبل القريب. هذا مثير للشفقة. يستخدم المبرمجون هذا الاختراع المريح للغاية على نطاق واسع ، ولكن في رأيي ، قد يكون مفيدًا جدًا لأولئك الذين يعملون بنشاط مع النصوص. ولكن ، على الأرجح ، لا يوجد الآن نظام تحكم في إصدار واحد يسهل البدء في استخدامه لـ "المكتب" ( مايكروسوفت أوفيس) الشغل. ومع ذلك ، أعتقد أن المادة المقدمة في المقال قد تكون ممتعة لجميع القراء.

إذا كنت قد فكرت في كيفية مشاهدة الأفلام على الشبكة من التلفزيون الخاص بك والاتصال بالإنترنت ، فهذه المقالة مناسبة لك. لا ، أعلم أن بعض أجهزة التلفزيون لديها بالفعل وظيفة Smart TV ، لكنني لم أرها تعمل بشكل صحيح من قبل. على ما يبدو ، لذلك ، أظهرت شركة Google مؤخرًا جهازًا مذهلاً للغاية ، والذي أصبح على الفور ضجة كبيرة. نحن نتحدث عن جهاز بث الوسائط Chromecast (Chromcast) ، وهو إصدار أكثر تقدمًا وبأسعار معقولة من جهاز Nexus Q الكارثي العام الماضي.

يتم توصيل Dongle Chromcast ، الذي لا يزيد حجمه عن 2 بوصة ، في المنفذ تلفزيون HDMIويسمح لك بالاستمتاع بمشاهدة بث محتوى الويب. للتحكم في جهاز البث ، يمكنك استخدام أي جهاز (جهاز لوحي ، كمبيوتر شخصي ، هاتف ذكي) بناءً على نظام التشغيل iOS أو Windows أو Android أو Mac OS.

تتناول هذه المقالة نظام الجهاز ذاكرة androidوالمشكلات التي قد تنشأ بسبب نقصها وطرق حلها. منذ وقت ليس ببعيد ، واجهت أنا نفسي حقيقة أن هاتفي الذي يعمل بنظام Android بدأ بإعطاء رسائل بانتظام حول عدم كفاية الذاكرة عند محاولة تثبيت أحد التطبيقات. كان الأمر غريبًا جدًا بالنسبة لي ، نظرًا لأنه وفقًا للوصف في السوق ، كان يجب أن يكون هناك حوالي 16 جيجابايت ، وقمت أيضًا بزيادة هذا الحجم ببطاقة ذاكرة إضافية. ومع ذلك ، كانت هناك مشكلة ، واضطررت إلى العبث كثيرًا قبل أن أجد الحل الصحيح الذي لا يتطلب الوصول إلى الجذر أو التعافي الكاملالهاتف إلى حالة المصنع.

في الآونة الأخيرة ، تم إيلاء الكثير من الاهتمام لبناء أنظمة الأعمال الإلكترونية ، أو كما يطلق عليها أيضًا - B2B (من شركة إلى شركة). مع الأخذ في الاعتبار التوصيات الخاصة ببناء أنظمة تدفق التبادل للهيئة المنسقة لتقنيات الإنترنت - اتحاد WWW: يتم التركيز على تقنيات XML وبناء أنظمة لتبادل وثائق XML.

ميزة استخدام XML بتنسيق الأعمال الإلكترونية- كفاءة عالية لأنظمة B2B بتكلفة منخفضة لإنشائها بسبب عرض واضح ومرئي للمعلومات المنظمة ، والقدرة على استخدام الحديث بروتوكولات الشبكةوإنشاء أنظمة أعمال في الوقت الفعلي.

استقلالية عرض المعلومات بالشكل مستندات XMLيسمح للشركات المختلفة المشاركة في الأعمال التجارية الإلكترونية بإنتاج برامج مستقلة عن بعضها البعض.

في جميع الأنظمة ، يتم إنشاء التبادل ، كقاعدة عامة ، وفقًا لنفس المخطط ، باستخدام طلبات HTTP. يتم استخدام بروتوكول SSL كبروتوكول أمن المعلومات (ولكن هذا موضوع منفصل).

واحد من الخيارات الممكنةمعالجة رسائل XML هي بناء تطبيقات BIN / CGI (ISAPI) أو مكونات COM (الخادم) التي تشكل مستندات XML أو تعالجها.

من ناحية أخرى ، يعمل التطبيق كعميل ، ويصدر طلب HTTP في وضع POST ، ومن ناحية أخرى ، يوجد خادم WEB يتم من جانبه معالجة الطلب وإصدار استجابة. يستخدم تبادل المعلومات مستندات XML.

أحد أكثر خيارات التنفيذ كفاءة هو استخدام محلل XML موجود يدعم نموذج DOM. مثل هذا المحلل اللغوي هو توزيع Win'98 أو جزء من IE 4.7 والإصدارات الأحدث (لـ Win`95) ويمثل خادم COM الموجود في مكتبة msxml.dll.

نموذج كائن المكون (COM) - يقدم بيانات وأساليب مغلفة في كيان واحد وطريقة للوصول إليها من خلال نظام واجهات. باستخدام أدوات دلفي ، من السهل جدًا الوصول إلى فئات كائن COM (يمكن تضمين عدة فئات في خادم COM واحد). يتم الوصول إلى الكائنات عن طريق تهيئة مثيل للفئة من خلال نظام الواجهة. يتم تنفيذ وصف الواجهات بواسطة لغة تعريف الواجهة (IDL) ، والتي يمكن تنفيذها تلقائيًا عن طريق البيئة.

تستخدم أدوات دلفي للاستيراد من خادم COM msxml.dll، تم إنشاء ملفات وصف واجهة IDL وملف الوصف الثنائي لأنواع المكتبات - TLB. هذه العمليةيتم تنفيذها من خلال قائمة النظام: مشروع | اكتب استيراد مكتبة:(الصورة 1). بعد ذلك ، يظهر مربع حوار (الشكل 2) ، حيث تحتاج إلى تحديد كائن COM (في حالتنا ، يتم تسجيل الكائن تحت اسم "Microsoft.XMLDom (الإصدار 2.0)") وإنشاء ملف TLB (زر إنشاء وحدة). باستخدام ملف TLB ، يقوم إطار العمل بإنشاء ملف وصف خادم COM Pascal - MSXML_TLB.pas

يصف ملف MSXML_TLB.pas كافة الواجهات والثوابت و coclasses لخادم COM.

للوصول إلى كائنات عنصر COM ، تحتاج في التوجيه الاستخداماتأضف اسم ملف وصف المكتبة (MSXML_TLB.pas). يوجد أدناه برنامج بسيط يستخدم محلل DOM القياسي msxml.dll ، والذي يقوم بتحميل مستند XML ويعرضه في عنصر حقل نصي Memo1.

الاستخدامات Windows ، الرسائل ، SysUtils ، الفئات ، الرسومات ، عناصر التحكم ، النماذج ، الحوارات ، OleServer ، MSXML_TLB ، StdCtrls ؛ نوع TForm1 = صف دراسي(TForm) Button1: زر TB ؛ Memo1: TMemo ؛ إجراء Button1Click (المرسل: TObject) ؛ نهاية؛ فار Form1: TForm1 ؛ تطبيق($ R * .DFM) إجراء TForm1.Button1Click (المرسل: Tobject) ؛ // إعلان عن سوكلاس كائن DOMDocument ؛ فار coDoc: CoDOMDocument؛ // فئة متوافقة مع واجهة IDOMDocument ؛ فارالوثيقة: IXMLDOMDocument ؛ يبدأ // إنشاء مثيل لكائن DOMDocument ؛ Doc: = coDoc.Create ؛ // استدعاء الأسلوب Load لمثيل كائن DOMDocument؛ Doc.load ("data.xml") ؛ // الوصول إلى خاصية xml لمثيل DOMDocument ؛ Memo1.Text: = Doc.xml ؛ نهاية؛ نهاية.

مفهوم DOM - نموذج كائن المستند

يتم تمثيل كل مستند XML كمجموعة من العديد من الكائنات (الفئات) ، والتي يمكن الوصول إليها بمساعدة العناصر الفردية(حقول الكائن). DOM - تصف الواجهة الوصول إلى كائنات بسيطة من نوع DOMString أو CharacterData ، وإلى أجزاء أو منفصلة عناصر XMLالمستند: DOMFragmentElement ، DOMNode ، DOMElement.

فيما يلي أهم خصائص وأساليب كائنات XMLDOMDocument و XMLDOMNode و XMLDOMNodeList. وتجدر الإشارة إلى أن أساليب ووظائف كائنات DOM المعروضة أدناه (نموذج كائن المستند) يتم استخدامها بواسطة محلل Microsoft XML msxml.dll وهي أوسع إلى حد ما من النموذج المعتمد من قبل W3C DOM Consortium.

أكثر وصف كامليمكن العثور على واجهة كائنات DOM على

كائن XMLDOMDocument
يمثل المستوى الأعلى من التسلسل الهرمي للكائن ويحتوي على طرق للعمل مع المستند: تحميله ، وتحليله ، وإنشاء العناصر ، والسمات ، والتعليقات ، وما إلى ذلك. ...
الخصائص
غير متزامن خاصية تحديد وضع المعالجة الحالي
خطأ تحليلي إرجاع مرجع إلى كائن معالجة خطأ XMLDOMParseError
تمكين - تعطيل التحقق من المستند.
عنوان url يُرجع عنوان URL الخاص بالمستند
وثيقةالعنصر يحتوي على مرجع إلى العنصر الجذر للمستند ككائن XMLDOMElement.
أساليب
تحميل (url)
loadXML (xmlString)
يقوم بتحميل مستند XML ،
حفظ (objTarget) يحفظ مستند XML في ملف
إجهاض توقف عملية تحميل وتجهيز الوثيقة.
createAttribute (الاسم) يُنشئ سمة جديدة بالاسم المحدد للعنصر الحالي.
createNode (النوع ، الاسم ، nameSpaceURI) ينشئ عقدة من النوع والاسم المحددين
إنشاء عنصر (اسم العلامة) ينشئ عنصر مستند بالاسم المحدد.
createTextNode (بيانات) ينشئ نصًا داخل مستند
getElementsByTagName (tagname) إرجاع مرجع لمجموعة عناصر المستند بالاسم المحدد
nodeFromID (idString) ابحث عن عنصر بالمعرف

كائن XMLDOMNode
كائن XMLDOMNode الذي يقوم بتنفيذ واجهة DOM الأساسية العقدة، مخصص لمعالجة عقدة منفصلة لشجرة الوثيقة. تسمح لك خصائصها وطرقها بالحصول على معلومات كاملة حول العقدة الحالية وتغييرها - نوعها ، واسمها ، واسمها الكامل ، ومحتوياتها ، وقائمة العناصر الفرعية ، وما إلى ذلك.
الخصائص
nodeName ، baseName ترجع اسم العقدة الحالية.
اختصار تُرجع بادئة مساحة الاسم.
نوع البيانات يحدد نوع محتوى العقدة الحالية
nodeType ، nodeTypeString إرجاع نوع العقدة الحالية:
صفات الحصول على قائمة بسمات العقدة الحالية كمجموعة XMLDOMNamedNodeMap.
نص إرجاع محتويات الشجرة الفرعية الحالية كنص
xml إرجاع تمثيل XML للشجرة الفرعية الحالية.
العقدة تُرجع محتويات العقدة الحالية.
ChildNodes ترجع قائمة بالعناصر التابعة كـ XMLDOMNodeList.
أولا طفل ، آخر طفل إرجاع الطفل الأول / الأخير
الشقيق السابق ، الشقيق التالي إرجاع العنصر الشقيق السابق / التالي.
عقدة الأم يحتوي على رابط للعنصر الأصل.
مالك الوثيقة إرجاع مؤشر إلى المستند الذي يحتوي على العقدة الحالية.
أساليب
appendChild (جديد طفل) يضيف طفلاً جديدًا إلى العقدة الحالية.
insertBefore (newChild ، refChild) يُدرج عقدة فرعية ، ويضعها في الشجرة الفرعية الحالية على يسار العقدة المحددة بواسطة refChild.
cloneNode (عميق) يقوم بإنشاء نسخة من العنصر الحالي.
getAttribute(اسم)
getAttributeNode(اسم)
setAttribute (الاسم ، القيمة)
setAttributeNode (XMLDOMAttribute)
الوصول إلى سمات (إنشاء ، قراءة ، كتابة) للكائن. الاسم هو اسم السمة ، القيمة هي قيمتها. إرجاع كائن XMLDOMAttribute.
استبدال طفل (جديد ، قديم ، طفل) إزالة طفل (قديم ، طفل) استبدال الكائن oldChild في القائمة الحالية للكائنات التابعة بـ newChild. حذف كائن oldChild
selectNodes (patternString) حدد SingleNode (patternString) عائدات كائن XMLDOMNodeList، محددًا بنمط البحث أو العقدة الأولى
تحويل عقدة (ورقة الأنماط)
convertNodeToObject (ورقة الأنماط ، الإخراجObject)
يخصص ورقة أنماط للشجرة الفرعية للعقدة الحالية ويعيد سلسلة تمثل نتيجة المعالجة. المعلمة هي مرجع إلى كائن DOMDocument الذي يحتوي على عبارات XSL.

استخدام XML في الأعمال.

للحصول على صورة أوضح ، هناك حاجة إلى شرح ، ولماذا كل هذا مطلوب لفهم كيفية عملها:

عند إنشاء نظام B2B أو نظام ERP للشركات ، عند تنظيم تبادل المعلومات لوثائق XML بين المؤسسات أو فروع pr-I ، يتم استخدام نظام مثبت بكفاءة لنقل المعلومات استنادًا إلى خوادم WEB الحالية عبر بروتوكولات HTTP.

من ناحية أخرى ، يعمل التطبيق كعميل ، ويصدر طلب HTTP في وضع POST ، ومن ناحية أخرى ، يوجد خادم WEB ، يتم من جانبه معالجة الطلب وإصدار استجابة. تستخدم مستندات XML في التبادل.

على سبيل المثال ، في نظام تخطيط موارد المؤسسات للشركات ، وهو برنامج محاسبة (محاسبة ACS) ، من الضروري تشكيل طلب للحصول على فاتورة وإرسالها إلى فرع يحتوي على مستودع (مستودع ACS). AWP بيان مشكلة مماثل عند إنشاء نظام B2B ، عندما تطلب المؤسسة أ توافر المنتجات (تقدم طلبًا للشراء) من المورد ب.

تعمل المؤسسة أ وبرنامجها كعميل. يتم تقديم المستودع من قبل المورد B ، الذي لديه مجمع مستودع مع قاعدة بيانات على خادم SQL. يتم إجراء التبادل من خلال خادم WEB الخاص بالمورد V.

فيما يلي خوارزمية التبادل النموذجية التالية:


الشكل 3.
  1. المؤسسة أيبدأ عملية أ(طلب المنتج) ، والذي يعمل كعميل WEB.
  2. العملية أينشئ مستند XML (على سبيل المثال ، طلب فاتورة) وينقله كطلب POST http إلى خادم WEB للموفر B. بصفته URI ، يتم استخدام معرف المورد لتطبيق المعالجة. يمكن أن يكون URI هو نفسه لجميع أنواع المستندات ، أو فردًا لكل نوع. كل هذا يتوقف على هيكل خادم B2B (WEB).
  3. يقوم خادم WEB بتحليل الطلب وإنشاء خادم العملية بعن طريق تمرير نص مستند XML كمعامل.
    يتم تشغيل العملية B بواسطة خادم WEB وتتم معالجتها إما كصفحة ASP أو CGI (ISAPI) - تطبيق أو خادم JAVA (تطبيق الخادم)
  4. العملية ب- يولد طلبًا إلى خادم قاعدة بيانات SQL.
  5. ينفذ خادم SQL العمليات اللازمة في قاعدة البيانات ، ويولد استجابة ويعيدها العملية ب.
  6. حسب استجابة خادم SQL العملية بينشئ مستند XML (استجابة) ويعيده كاستجابة لطلب http إلى تطبيق العميل.
  7. علاوة على ذلك ، اعتمادًا على الموقف من جانب العميل ، إما أن يتم تكوين طلب http جديد ، أو تنتهي الجلسة.

بضع كلمات حول تنظيم تدفق المستندات.

القاعدة العامة لتطوير نظام لتبادل مستندات XML هي:

  • في البدايه- تطوير مخطط انسيابي للوثائق الإلكترونية وهيكلها ؛
  • ثانيا- تطوير جداول وظائف العملية (العمليات الفرعية) ، أي ما الوظيفة التي ستنفذها كل عملية فيما يتعلق بمستند XML.

يجب أن يتكون كل مستند XML ، مثل مستند HTML ، من رأس الرسالة (المعلومات المرفقة بالعلامات) ونص الرسالة (بالنسبة للطلب ، يتم تأطير هذه المعلومات بالعلامات للاستجابة للطلب). من أجل صياغة وثيقة XML بشكل جيد ، من الضروري تأطير الجزئين المكونين "العنوان" و "الطلب" مع العلامات ، على سبيل المثال. يتم عرض نوع المستند النموذجي أدناه:

يجب أن يحتوي العنوان (الشكل 4) ، على عكس مستند HTML ، على أنواع مختلفة من معلومات الخدمة ، بما في ذلك معلومات حول نوع المستند المرسل وعملية معالجته. يدخل نص المستند في معالجة المعلومات ، أي محتوى مؤطر بالعلامات. وتجدر الإشارة إلى أن بنية العناوين يجب أن تكون هي نفسها لجميع أنواع المستندات.

بالنسبة للعملية التي بدأها الخادم ، يفضل (ولكن ليس من الضروري) بناء خوارزمية المعالجة على النحو التالي:


الشكل 6.

بعض النقاط الأساسية عند إنشاء جانب العميل

كما أوضحنا سابقًا ، عند إنشاء مستند XML ، يتم استخدام تمثيله في شكل نموذج DOM. يوجد أدناه مثال على جزء نص دلفي من برنامج إنشاء رأس xml للرسالة.

إجراء TThread1.HeaderCreate (المرسل: Tobject) ؛ فار // إعلان فئة ، مطلوب للإنشاء coDoc: CoDomDocument ؛ // كائن XMLDomDocument Doc: DomDocument ؛ ص: IXMLDOMElement ؛ العقدة: IXMLDOMElement ؛ // DOMText txt: IXMLDOMText ؛ // DOMAttribute Attr: IXMLDOMAttribute ؛ يبدأ // إنشاء مستند DOM Doc: = coDoc.Create ؛ Doc.Set_async (خطأ) ؛ // الشروع الأولي لوثيقة DOM Doc.LoadXML ("
"); // إنشاء DOMElement (علامة<مرسل>) العقدة: = Doc.createElement ("المرسل") ؛ // إنشاء عقدة نصية " تايفون ذ" txt: = Doc.createTextNode ("Typhoon LLC") ، // الإحالة إلى العقدة<مرسل> القيمة // عقدة نصية " تايفون ذ" Node.appendChild (txt) ؛ // إضافة عنصر<مرسل> إلى جذر المستند عندما كان طفلاً r.appendChild (عقدة) ؛ <من عند> العقدة: = Doc.createElement ("من") ؛ txt: = Doc.createTextNode ("http://tayfun.ru/xml/default.asp") ؛ Node.appendChild (txt) ؛ r.appendChild (عقدة) ؛ // عمليات مماثلة للعلامة<إلى> العقدة: = Doc.createElement ("إلى") ؛ txt: = Doc.createTextNode ("http://irbis.ru") ؛ Node.appendChild (txt) ؛ r.appendChild (عقدة) ؛ // إنشاء DOMElement ()العقدة: = Doc.createElement ("TypeDocument") ؛ // إنشاء عقدة XMLDOMAttribute Att: = Doc.createAttribute ("Id"، "Order")؛ // Node.appendChild (أت) ، r.appendChild (عقدة) ؛ نهاية؛

وتجدر الإشارة إلى أن إعلان المتغير coDoc: CoDomDocument و Doc: DomDocument ، بالإضافة إلى إنشائه بطريقة الإنشاء (Doc: = coDoc.Create؛) يتم مرة واحدة. يقع إعلان المتغير في القسم الذي يصف المتغيرات العامة ، وليس في الإجراء المحلي ، كما تم توضيحه للتوضيح في هذا المثال (أي ، متغير عام واحد من نوع DomDocument لكل وحدة برنامج واحدة).

ستكون نتيجة عمل البرنامج أعلاه هو الترويسة التي تم إنشاؤها ، والتي يتم تطبيقها على مثال مستند xml الخاص بنا: كما هو موضح في الشكل 5.


الشكل 5.


الشكل 6.

تتمثل الميزة الرئيسية لنقل المعلومات في شكل مستندات XML في أنه من الممكن تكوين رسالة باستخدام هياكل جدول مستقلة في نظام إدارة قواعد البيانات (DBMS) على كل من المستقبِل والجانب المرسل. باستخدام مثالنا ، افترض أنه يلزم نقل المعلومات حول فواتير المؤسسة أ ، من نظام إدارة قواعد البيانات الذي يحتوي على الهيكل الموضح في الشكل 6

لإنشاء مستند xml يحتوي على فاتورة ، يتم إنشاء استعلام SQL (الاستعلام أ) مبدئيًا بمعلومات حول الفاتورة نفسها:

تحديد* من Invoice_General أين InvoiceNum =: الأسطوانات تحديدالبضائع ، الجودة ، السعر ، HZ_cod من عندبضائع أين InvoiceNum =: الأسطوانات //: num هي معلمة تحدد رقم الفاتورة.

يوجد أدناه جزء من البرنامج الذي يقوم بإنشاء جسم مستند xml:

إجراء TThread1.DataBodyCreate (المرسل: Tobject) ، فار // تعريف الفئة وكائن XMLDomDocument// coDoc: CoDomDocument ؛ // يجب أن يكون عالميًا للوحدة بأكملها.// Doc: DomDocument ؛ // أعلن DOMElement كائناتص: IXMLDOMElement ؛ // DOMElement ؛ العقدة ، Node2: IXMLDOMElement ؛ Node3 ، Node4: IXMLDOMElement ؛ // DOMText txt: IXMLDOMText ؛ str: سلسلة ؛ // InvoiceNumber: عدد صحيح؛- المتغير العام - // له القيمة 987654 // queryA ، queryB: سلسلة؛- المتغير العام ، // له قيمة مقابلة للاستعلام // استعلام أ - استعلام أ بمعلومات عامة حول الفاتورة // الاستعلام ب - الاستعلام ب عن البضائع الموصوفة في الفاتورة (انظر النص) يبدأاستعلام. // انظر النص "طلب أ" Query.Text: = queryA؛ // تنفيذ الطلبالاستعلام. الاستعلام. // احصل على عنوان عنصر الجذرص: = Doc.Get_documentElement ؛ Node2: = Doc.createElement ("طلب") ؛ // إنشاء DOMElement (علامة)العقدة: = Doc.createElement ("الفاتورة") ؛ // إضافة عنصر إلى الجذر r.appendChild (Node2) ؛ // إضافة عنصر إلىالعقدة 2. appendChild (عقدة) ؛ // إنشاء DOMElement (علامة) Node3: = Doc.createElement ("Depurture") ؛ // إضافة عنصر إلىالعقدة. appendChild (Node3) ؛ // استدعاء إلى حقل "Depurture" للطلب str: = Query.FieldByName ("Depurture"). AsString؛ // إنشاء عقدة نصية = قيمة الحقل// تعيين قيمة للعقدة // عقدة النص ، متغير str Node.appendChild (txt) ؛ // عمليات مماثلة للعلامة , , // , // (حقل DB "المرسل إليه")العقدة: = Doc.createElement ("الوجهة") ؛ // قد لا يكون اسم حقل قاعدة البيانات هو نفسه الاسم str: = Query.FieldByName ("المرسل إليه") .AsString؛ // tag ، فهذه ميزة استخدام txt: = Doc.createTextNode (str) ، // DOM للواجهة أمام DBMS التي تدعم واجهة XML ، // مثل ORACLE 8i أو Ms SQL 2000 Node.appendChild (txt) ؛ ... // إنشاء طلب لمواصفات البضائع // أغلق طلب الوصولاستعلام. // انظر في النص "طلب ب" ، معلومات. حول البضائع Query.Text: = queryВ؛ // تعيين قيم المعلمات Query.Params.AsInteger: = InvoiceNumber ؛ // تنفيذ الطلب Query2.ExecSQL ؛ // فتح الوصول لطلب البياناتالاستعلام. // إنشاء DOMElement (علامة) Node3: = Doc.createElement ("Imems") ؛ // إضافة عنصر إلىالعقدة. appendChild (Node3) ؛ // حلقة عبر جميع أسطر الاستعلام في حين ليساستعلام فعلبدء Node4: = Doc.createElement ("Imem") ؛ // إضافة عنصر إلى Node3.appendChild (Node4) ، // تشكيل البيانات للعلامة str: = Query.FieldByName ("السعر"). AsString؛ txt: = Doc.createTextNode (str) ، Node.appendChild (txt) ؛ ... // عمليات مماثلة للعلامات , , نهاية؛ نهاية؛

نتيجة لهذا الإجراء ، يتم إنشاء النص التالي لمستند XML:


لتكوين طلب ، يتم استخدام طريقة الفتح للكائن IXMLHttpRequest:

إجراءفتح (const bstrMethod ، - نوع الأسلوب = "POST" bstrUrl ، - عنوان URL للخادم varAsync ، - وضع الاتصال غير المتزامن / المتزامن = bstrUser صحيح ، - اسم المستخدم للمصادقة bstrPassword) - كلمة المرور

إنشاء جانب الخادم من معالجة المستندات

كما لوحظ سابقًا ، المعالجة طلب HTTPيمكن تنفيذها إما عن طريق تطبيقات CGI أو Java servlets. متغير كتابة صفحات ASP ممكن أيضًا. ولكن في هذه الحالة ، لا يمكن نقل البيانات إلا من خلال طريقة "GET" من خلال سلسلة الاستعلام. ومع ذلك ، فإن معالجة طلب HTTP لصفحات ASP أكثر كفاءة من تطبيق CGI. ومع ذلك ، في رأيي ، لا يهم كيفية معالجته ، ولكن الأهم هو حل السؤال - كيفية بناء برنامج معالجة ، وليس بأي وسيلة.

إذا قمنا من الفصل السابق بفحص خيارات تكوين مستند XML ، فإن مهمة تطبيق الخادم هي عكس ذلك - تحليل مستندات XML. يوجد أدناه جزء من البرنامج الذي يوزع مستند xml:

إجراء Tthread1.DataParser (المرسل: Tobject) ، فار // أعلن DOMElement كائناتص ، FNode: IXMLDOMElement ؛ Str ، اسم الملف: String ؛ بارم: سلسلة ؛ // تصريح soclass و CoDocXML و CoDocXSL و CoDocResult: CoDomDocument ؛ // كائن XMLDomDocument XMLDoc ، XSLDoc ، ResultDoc: DomDocument ؛ // HttpStr: String؛ - متغير عام يحتوي على سلسلة طلب HTTP يبدأ XMLDoc: = coDocXML.Create ؛ XMLDoc.LoadXML (HttpStr) ، // احصل على عنوان عنصر الجذرص: = Doc.Get_documentElement ؛ // احصل على قيمة العنصر FNode: = r.SelectSingleNode ("// TypeDocument") ؛ // احصل على قيمة السمة id = "Order"اسم الملف: = FNode.GetAttibute ("id") ؛ // وتشكيل اسم الملف Order.xslاسم الملف: = FileName + ". Xsl" ؛ // إنشاء مستند XSLDoc XSLDoc: = coDocXSL.Create ؛ XSLDoc.LoadXML (اسم الملف) ، // إنشاء مستند XMLDoc ResultDoc: = coDocResult.Create ؛ // ضبط وضع المعالجة المتزامن ResultDoc.Set_async (خطأ) ، // تعيين فحص التحليل ResultDoc.validateOnParse: = صحيح ؛ // تحليل XMLDoc باستخدام نموذج XSL XMLDoc.transformNodeToObject (XSLDoc ، ResultDoc) ، // يتم تعيين قيمة نصية لمتغير Str // من الوثيقة الناتجة. Str: = ResultDoc.text ؛ // ابحث عن عنصر FNode: = r.SelectSingleNode ("// InvoiceNumber") ؛ // واحصل على قيمة العنصربارم: = FNode.text ؛ // أغلق طلب الوصولاستعلام. Query.Text: = Str ؛ // إسناد قيمة المعلمة Query.Params.AsString: = parm؛ // تنفيذ الطلبالاستعلام. نهاية؛

إن أهم ما يميز التحليل هو استخدام قالب XSL ، والذي يتم إنشاؤه بشكل فردي لكل نوع من أنواع المستندات. نتيجة التحليل عبارة عن سلسلة استعلام SQL. بعد ذلك ، سيؤدي تنفيذ سلسلة استعلام SQL التي تم إنشاؤها إلى إجراء التغييرات اللازمة على البيانات في نظام إدارة قواعد البيانات.

تتمثل ميزة استخدام التحليل من خلال قالب أيضًا في الحصول على بعض مرونة البيانات ، ويتم الحصول على الاستقلال التام للخوارزمية عن رمز البرنامج. يوجد أدناه نص نموذج XSL المستخدم لمعالجة مستند ORDER:

إدراج في TABREG (من ، إلى ، TYPEDOC ، الجسم) VALUES (" ", "", "") أدخل في GOODS (رقم الفاتورة ، الاسم ، السعر ، الجودة) VALUES (": num"، " ", "", " ")

لشرح المثال أعلاه ، تجدر الإشارة إلى أن استخدام زوج من العلامات رسمي بطبيعته ، منذ ذلك الحين بعد التحليل ، يجب أن يحتوي مستند XML الناتج رسميًا على عقدة واحدة على الأقل. يعين أسلوب ResultDoc.text القيمة النصية لـ ResultDoc التي تم الحصول عليها أثناء تحليل مستند XML. في هذه الحالة ، تكون القيمة هي كل ما تم تأطيره بواسطة زوج من العلامات ، أي استعلام SQL الذي أنشأناه.

ميزة أخرى لكتابة البرنامج وتجدر الإشارة إلى إمكانية استخدام معلمة SQL : الأس.يؤدي استخدام المعلمة إلى تبسيط نص قالب xsl. يتم تحديد تعريف قيمة العناصر المقابلة لعقد مستند XML مبدئيًا عن طريق التحديد بواسطة اسم العقدة المقابلة ، على سبيل المثال:

XSL في لمحة

يأتي الاختصار XSL من لغة أوراق الأنماط الموسعة - لغة تنسيق ورقة الأنماط (بيانات XML). كما ترى من العنوان ، يتم استخدام لغة ورقة الأنماط القابلة للتمديد (XSL) لتنسيق بيانات XML. بحكم التعريف ، يتكون W3C XSL من جزأين:

  • XSLT - تحويل XSL. اللغة المستخدمة لتحويل أو تنسيق (تحويل) مستندات XML. وبالتالي ، بمساعدة XSLT ، يمكننا الحصول على قطع مختلفة لمجموعة من البيانات وأشكال عرض البيانات.
  • عناصر التنسيق. تتضمن هذه العناصر جميع العناصر المطبعية للبيانات ، بعد معالجتها باستخدام XSL. تستخدم فقط للتشكيل صفحات HTML.

بمساعدة XSLT ، يمكننا تحديد البيانات التي نحتاجها من ملف XML ، وترتيبها في نموذج لعرضها على المستخدم. على سبيل المثال ، في حالتنا ، قمنا بتحويل بيانات XML إلى استعلام SQL... عادةً ما يكون الاستخدام الكلاسيكي لـ XSL هو تنسيق البيانات في شكل صفحات HTML أو ، نادرًا ، في شكل ملفات RTF.

يصف ملف XSL قالبًا يتم بموجبه إجراء تحويل بيانات XML. بالعودة إلى قوالب xsl ، يمكن تمييز العناصر (التوجيهات) التالية في XSLT:

توجيهات XSL وصف
xsl: تطبيق القوالب توجيه يشير إلى استخدام القوالب المتطابقة للسمة المحددة = "اسم القالب"
xsl: سمة ينشئ شجرة سمات ويضيفها إلى عنصر الإخراج ، اسم المعلمة = "اسم السمة" ، مساحة الاسم هي مساحة الاسم URI (بادئة مساحة الاسم)
xsl: قالب استدعاء يستدعي قالبًا ، اسم السمة = "URI للقالب"
xsl: اختر
xsl: متى
xsl: خلاف ذلك
التحديد حسب الشرط xsl: when expr = "تقييم التعبير في البرنامج النصي" ،
اللغة = "اسم اللغة"
اختبار = "تعبير تم تقييمه"
xsl: تعليق يولد تعليقًا في مستند الإخراج
xsl: نسخة
xsl: نسخة من
نسخ العقدة الحالية إلى مصدر الإخراج أو إدراج جزء من المستند في عقدة حيث السمة المحددة = "اسم عقدة المصدر"
xsl: العنصر ينشئ عنصر إخراج بالاسم ، اسم السمة = "اسم العنصر" ، مساحة الاسم = "مرجع مساحة اسم uri"
xsl: لكل يعيد تطبيق القالب على جميع عقد قائمة العقد ، وتحدد سمة التحديد قائمة العقد
xsl: إذا فحص الشرط ، تم تعيينه بواسطة سمة الاختبار كتعبير
xsl: تشمل يتضمن نموذجًا خارجيًا ، السمة href = "مرجع URI"
xsl: الإخراج يحدد الإخراج ، يمكن أن تكون سمة الأسلوب "xml" أو "html" أو "النص"
xsl: param يحدد قيمة المعلمات ، اسم السمة = "اسم المعلمة" ، حدد = "القيمة"
xsl: تعليمات المعالجة ينشئ تعليمات معالجة ، اسم السمة = "اسم تعليمات العملية"
xsl: الترتيب أنواع مجموعة العقد ، تحديد السمات = "اسم العقدة" ، نوع البيانات = نوع البيانات ("نص" | "رقم" | Qname) ، الترتيب = اتجاه الفرز ("تصاعدي" | "تنازلي")
xsl: ورقة الأنماط يعرّف مستند نموذج xsl ، هو العنصر الجذر لـ XSLT
xsl: نموذج يعرّف قالب xsl ، اسم السمة = "بادئة URI لاسم القالب" ، match = "إشارة إلى العقدة التي تم تطبيق القالب عليها"
xsl: نص يولد نصًا إلى دفق الإخراج ، أو تعطيل السمة - الإخراج - الهروب = "نعم" أو "لا" ، ويشير إلى القدرة على إنشاء أحرف ESC
xsl: قيمة لإدراج قيمة العقدة المحددة كنص ، تحديد السمة = "المؤشر إلى العقدة" التي يتم أخذ القيمة منها
xsl: متغير يحدد قيمة حدود المتغير ، اسم السمة = "اسم المتغير" ، حدد = "حساب قيمة المتغير"
xsl: مع بارام يطبق المعلمة على القالب ، اسم السمة = "اسم المعلمة" ، حدد = التعبير لتقييم السياق الحالي ، القيمة الافتراضية "."

استنتاج

أخيرًا ، تجدر الإشارة إلى استخدام محلل XML القياسي msxml.dllليست الأداة الوحيدة لتحليل وإنشاء مستندات XML. على سبيل المثال ، لإنشاء مستندات XML ، استخدم المكونات بشكل فعال TPageProduserو TableProduser... لكن هذه المقالة تؤكد فقط على اتساع وقابلية تطبيق نموذج DOM في الممارسة.

سيكون المؤلف ممتنًا جدًا لتعليقاتك حول أهمية الموضوع والمحتوى العام وأسلوب العرض ، بالإضافة إلى جميع التعليقات الأخرى التي ستساعد على تحسين جودة كتابة مجموعة من المقالات وإصدار كتاب يغطي موضوع الجانب العملي لاستخدام مستندات XML في التجارة الإلكترونية. أكثر معلومات مفصلةيمكن العثور على الجانب العملي لاستخدام المستندات الإلكترونية على موقع المؤلف www.eDocs.al.ru أيضًا على موقع المؤلف ، من المخطط وضع النصوص المصدر والأمثلة.

يتم استخدام XML بشكل متزايد لتخزين المعلومات وتبادلها بين التطبيقات ومواقع الويب. تستخدم العديد من التطبيقات هذه اللغة كلغة أساسية لتخزين البيانات ، بينما يستخدمها الآخرون لتصدير بيانات XML واستيرادها. لذلك حان الوقت للمطورين للتفكير في كيفية استخدام بيانات XML في تطبيقاتهم الخاصة.

في هذه المقالة ، سنلقي نظرة على نموذج كائن مستند XML (DOM) وتطبيق Microsoft لـ XML DOM.

XML DOM هو نموذج كائن يوفر للمطور كائنات لتحميل ملفات XML ومعالجتها. يتكون نموذج الكائن من الكائنات الأساسية التالية: XMLDOMDocument و XMLDOMNodeList و XMLDOMNode و XMLDOMNamedNodeMap و XMLDOMParseError. يحتوي كل عنصر من هذه الكائنات (باستثناء XMLDOMParseError) على خصائص وطرق تتيح لك الحصول على معلومات حول الكائن ومعالجة قيم الكائن وبنيته والتنقل في بنية مستند XML.

لنلقِ نظرة على كائنات XML DOM الرئيسية ونعرض بعض الأمثلة على استخدامها في Borland Delphi.

استخدام XML DOM في بورلاند دلفي

من أجل استخدام Microsoft XML DOM في تطبيقات دلفي ، تحتاج إلى توصيل مكتبة النوع المناسب بالمشروع. للقيام بذلك ، نقوم بتنفيذ الأمر Project | مكتبة نوع الاستيراد وفي مربع الحوار مكتبة نوع الاستيراد ، حدد مكتبة Microsoft XML الإصدار 2.0 (الإصدار 2.0) ، والتي توجد عادةً في ملف Windows \ System \ MSXML.DLL

بعد النقر فوق الزر "إنشاء وحدة" ، سيتم إنشاء وحدة واجهة MSXML_TLB ، والتي ستسمح لنا باستخدام كائنات XML DOM: DOMDocument ، و XMLDocument ، و XMLHTTPRequest وعدد من الآخرين ، تم تنفيذها في مكتبة MSXML.DLL. يجب أن يكون المرجع إلى الوحدة النمطية MSXML_TLB في قائمة الاستخدامات.

جهاز XML DOM

يمثل نموذج كائن المستند مستند XML في هيكل شجرة من الفروع. تسمح واجهات برمجة تطبيقات XML DOM للتطبيقات بالتنقل في شجرة المستند والتعامل مع فروعها. يمكن أن يكون لكل فرع نوع معين (DOMNodeType) ، وفقًا له يتم تحديد الفروع الرئيسية والفرعية. تحتوي معظم مستندات XML على فروع لعنصر النوع والسمة والنص. السمات هي نوع خاص من الفروع وليست فروعًا فرعية. يتم استخدام الطرق الخاصة التي توفرها كائنات XML DOM لمعالجة السمات.

بالإضافة إلى تنفيذ الواجهات الموصى بها من اتحاد شبكة الويب العالمية (W3C) ، يحتوي Microsoft XML DOM على طرق تدعم XSL وأنماط XSL ومساحات الأسماء وأنواع البيانات. على سبيل المثال ، تسمح لك طريقة SelectNodes باستخدام XSL Pattern Syntax للعثور على الفروع في سياق معين ، وتدعم طريقة TransformNode استخدام XSL لإجراء التحويلات.

اختبار مستند XML

كمثال على مستند XML ، لنأخذ دليل CD-ROM للموسيقى ، والذي يحتوي على البنية التالية:

الإمبراطورية هزلية بوب ديلان الولايات المتحدة الأمريكية كولومبيا 10.90 1985 اخفي قلبك بوني تايلور المملكة المتحدة سجلات CBS 9.90 1988 ... حرر قلبى جو كوكر الولايات المتحدة الأمريكية EMI 8.20 1987

نحن الآن جاهزون لبدء النظر في نموذج كائن XML DOM ، بدءًا من كائن XMLDOMDocument.

مستند XML - كائن XMLDOMDocument

يبدأ العمل مع مستند XML بتحميله. للقيام بذلك ، نستخدم طريقة التحميل ، التي تحتوي على معلمة واحدة فقط تحدد عنوان URL للمستند الذي تم تحميله. عند تحميل الملفات من قرص محلي ، يتم تحديد اسم الملف الكامل فقط (يمكن حذف الملف: /// البروتوكول في هذه الحالة). إذا تم تخزين مستند XML كسلسلة ، فاستخدم طريقة LoadXML لتحميل المستند.

يتم استخدام الخاصية Async للتحكم في كيفية تحميل المستند (متزامن أو غير متزامن). بشكل افتراضي ، يتم تعيين هذه الخاصية إلى True ، مما يشير إلى أنه يتم تحميل المستند بشكل غير متزامن ويتم إرجاع التحكم إلى التطبيق قبل تحميل المستند بالكامل. خلاف ذلك ، يتم تحميل المستند بشكل متزامن ، ومن ثم يتعين عليك التحقق من قيمة خاصية ReadyState لمعرفة ما إذا كان المستند قد تم تحميله أم لا. يمكنك أيضًا إنشاء معالج حدث للحدث OnReadyStateChange الذي سيتولى التحكم عند تغيير قيمة خاصية ReadyState.

يوضح ما يلي كيفية تحميل مستند XML باستخدام طريقة التحميل:

يستخدم ... MSXML_TLB ... إجراء TForm1.Button1Click (المرسل: TObject) ؛ var XMLDoc: IXMLDOMDocument ؛ بدء XMLDoc: = CoDOMDocument.Create ؛ XMLDoc.Async: = خطأ ، XMLDoc.Load ("C: \ DATA \ DATA.xml") ؛ // // هذا هو مكان الكود الذي يعالج // مستند XML وفروعه // XMLDoc: = Nil؛ نهاية؛

بعد تحميل المستند ، يمكننا الوصول إلى خصائصه. لذلك ، ستحتوي خاصية NodeName على القيمة #document ، وستحتوي الخاصية NodeTypeString على قيمة المستند ، وستحتوي خاصية URL على قيمة الملف: /// C: /DATA/DATA.xml.

معالجة الأخطاء

تحظى الخصائص المتعلقة بمعالجة المستندات عند التحميل بأهمية خاصة. على سبيل المثال ، تقوم الخاصية ParseError بإرجاع كائن XMLDOMParseError يحتوي على معلومات حول خطأ حدث أثناء معالجة المستند.

لكتابة معالج الأخطاء ، يمكنك إضافة التعليمات البرمجية التالية:

Var XMLError: IXMLDOMParseError ؛ ... XMLDoc.Load ("C: \ DATA \ DATA.xml") ؛ XMLError: = XMLDoc.ParseError ؛ إذا كان XMLError.ErrorCode<>0 ثم // // هنا نتعامل مع الخطأ // Else Memo1.Lines.Add (XMLDoc.XML)؛ ... XMLDoc: = لا شيء ؛

لمعرفة المعلومات التي يتم إرجاعها في حالة حدوث خطأ ، قم بتغيير إدخال الدليل التالي:

الإمبراطورية هزلية بوب ديلان الولايات المتحدة الأمريكية كولومبيا 10.90 1985

إزالة عنصر الإغلاق في السطر الثاني:</p><p> <CD> <TITLE>الإمبراطورية هزلية <ARTIST>بوب ديلان</ARTIST> <COUNTRY>الولايات المتحدة الأمريكية</COUNTRY> <COMPANY>كولومبيا</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>لنكتب الآن بعض التعليمات البرمجية التي تُرجع قيم خاصية كائن XMLDOMParseError:</p><p>XMLError: = XMLDoc.ParseError ؛ إذا كان XMLError.ErrorCode<>0 ثم باستخدام XMLError ، تبدأ Memo1.Lines بالفعل Add ("File:" + URL) ؛ أضف ("الرمز:" + IntToStr (ErrorCode)) ؛ أضف ("خطأ:" + سبب) ؛ إضافة ("نص:" + SrcText) ؛ أضف ("Line:" + IntToStr (Line)) ؛ إضافة ("Position:" + IntToStr (LinePos)) ؛ end Else Memo1.Lines.Add (XMLDoc.XML) ، نهاية؛</p><p>وتنفيذ طلبنا. نتيجة لذلك ، نحصل على المعلومات التالية حول الخطأ.</p> <p>كما ترى من المثال أعلاه ، فإن المعلومات التي يتم إرجاعها بواسطة كائن XMLDOMParseError كافية تمامًا لتعريب الخطأ وفهم سبب حدوثه.</p> <p>الآن سنقوم باستعادة عنصر الإغلاق <TITLE>في وثيقتنا ومتابعة مناقشتنا حول XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>الوصول إلى شجرة الوثيقة</h2> <p>للوصول إلى شجرة المستند ، يمكنك إما الحصول على عنصر الجذر ثم التكرار على فروعه الفرعية ، أو العثور على فرع معين. في الحالة الأولى ، نحصل على العنصر الجذر من خلال خاصية DocumentElement ، التي تُرجع كائنًا من النوع XMLDOMNode. إليك كيفية استخدام خاصية DocumentElement للحصول على محتويات كل عنصر فرعي:</p><p>عقدة فار: IXMLDOMNode ؛ الجذر: IXMLDOMElement ؛ أنا: عدد صحيح ؛ ... الجذر: = XMLDoc.DocumentElement ؛ بالنسبة إلى I: = 0 إلى Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]؛ Memo1.Lines.Add (Node.Text) ، نهاية؛</p><p>بالنسبة لوثيقة XML الخاصة بنا ، نحصل على النص التالي.</p> <p>إذا كنا مهتمين بفرع معين أو فرع أسفل الفرع الفرعي الأول ، فيمكننا استخدام طريقة NodeFromID أو طريقة GetElementByTagName للكائن XMLDOMDocument.</p> <p>تتطلب طريقة NodeFromID معرفًا فريدًا كما هو محدد في مخطط XML أو تعريف نوع المستند (DTD) وتقوم بإرجاع فرع بهذا المعرف.</p> <p>تتطلب طريقة GetElementByTagName سلسلة تحتوي على عنصر معين (علامة) وتقوم بإرجاع كافة الفروع التي تحتوي على هذا العنصر. إليك كيفية استخدام هذه الطريقة للعثور على جميع الفنانين في دليل الأقراص المضغوطة لدينا:</p><p>العقد: IXMLDOMNodeList؛ العقدة: IXMLDOMNode ؛ ... العقد: = XMLDoc.GetElementsByTagName ("ARTIST") ؛ بالنسبة إلى I: = 0 إلى Nodes.Length-1 do Begin Node: = Nodes.Item [I]؛ Memo1.Lines.Add (Node.Text) ، نهاية؛</p><p>بالنسبة لوثيقة XML الخاصة بنا ، سوف نحصل على النص التالي</p> <p>لاحظ أن أسلوب SelectNodes الخاص بكائن XMLDOMNode يوفر طريقة أكثر مرونة للوصول إلى فروع المستندات. لكن المزيد عن ذلك أدناه.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>فرع المستند - كائن XMLDOMNode</h2> <p>يمثل كائن XMLDOMNode فرع المستند. لقد واجهنا هذا الكائن بالفعل عندما حصلنا على العنصر الجذر للمستند:</p><p>الجذر: = XMLDoc.DocumentElement ؛</p><p>للحصول على معلومات حول فرع من مستند XML ، يمكنك استخدام خصائص كائن XMLDOMNode (الجدول 1).</p> <p>للوصول إلى البيانات المخزنة في فرع ، من الشائع استخدام إما خاصية NodeValue (متاحة للسمات ، وفروع النص ، والتعليقات ، وإرشادات المعالجة ، وأقسام CDATA) ، أو خاصية Text ، التي تُرجع محتوى النص للفرع ، أو خاصية NodeTypedValue. ومع ذلك ، لا يمكن استخدام الأخير إلا مع الفروع ذات العناصر المكتوبة.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>التنقل في شجرة الوثيقة</h3> <p>يوفر كائن XMLDOMNode العديد من الطرق للتنقل في شجرة المستند. على سبيل المثال ، للوصول إلى الفرع الأصلي ، استخدم خاصية ParentNode (نوع XMLDOMNode) ، والوصول إلى الفروع الفرعية من خلال خصائص ChildNodes (نوع XMLDOMNodeList) ، FirstChild و LastChild (نوع XMLDOMNode) ، إلخ. تقوم الخاصية OwnerDocument بإرجاع كائن XMLDOMDocument الذي يعرّف مستند XML نفسه. تجعل الخصائص المذكورة أعلاه من السهل التنقل في شجرة المستندات.</p> <p>الآن دعنا ننتقل عبر جميع فروع مستند XML:</p><p>الجذر: = XMLDoc.DocumentElement ؛ بالنسبة إلى I: = 0 إلى Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]؛ إذا Node.HasChildNodes ثم GetChilds (عقدة ، 0) ؛ نهاية؛</p><p>كما هو مذكور أعلاه ، توفر SelectNodes الخاص بكائن XMLDOMNode طريقة أكثر مرونة للوصول إلى فروع المستندات. بالإضافة إلى ذلك ، هناك طريقة SelectSingleNode تقوم بإرجاع الفرع الأول فقط من المستند. تسمح لك هاتان الطريقتان بتعريف قوالب XSL لعمليات البحث في الفروع.</p> <p>لنلقِ نظرة على عملية استخدام طريقة SelectNodes لجلب جميع الفروع التي لها فرع CD وفرع فرعي PRICE:</p><p>الجذر: = XMLDoc.DocumentElement ؛ العقد: = Root.SelectNodes ("CD / PRICE") ؛</p><p>سيتم وضع جميع الفروع الفرعية لـ PRICE لفرع CD في مجموعة العقد. سنعود لمناقشة قوالب XSL لاحقًا.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>التلاعب بالفروع الفرعية</h3> <p>لمعالجة الفروع الفرعية ، يمكننا استخدام أساليب كائن XMLDOMNode (الجدول 2).</p> <p>من أجل حذف السجل الخاص بالقرص الأول تمامًا ، تحتاج إلى تشغيل الكود التالي:</p><p>Var XMLDoc: IXMLDOMDocument ؛ الجذر: IXMLDOMNode ؛ العقدة: IXMLDOMNode ؛ XMLDoc: = CoDOMDocument.Create ، XMLDoc.Async: = False؛ XMLDoc.Load ("C: \ DATA \ DATA.xml") ؛ // احصل على الجذر الجذر: = XMLDoc.DocumentElement؛ العقدة: = الجذر ؛ // إزالة أول فرع فرعي Node.RemoveChild (Node.FirstChild) ؛</p><p>لاحظ أننا في هذا المثال نحذف أول فرع فرعي. كيفية إزالة العنصر الأول من أول فرع فرعي موضحة أدناه:</p><p>Var XMLDoc: IXMLDOMDocument ؛ الجذر: IXMLDOMNode ؛ العقدة: IXMLDOMNode ؛ XMLDoc: = CoDOMDocument.Create ، XMLDoc.Async: = خطأ ، XMLDoc.Load ("C: \ DATA \ DATA.xml") ؛ // احصل على الجذر الجذر: = XMLDoc.DocumentElement؛ // والعقدة الفرعية الأولى: = Root.FirstChild؛ // إزالة أول فرع فرعي Node.RemoveChild (Node.FirstChild) ؛</p><p>في المثال أعلاه ، حذفنا ليس الفرع الأول <CD>…</CD>والعنصر الأول للفرع هو <TITLE>….

لنقم الآن بإضافة فرع جديد. يوجد أدناه الرمز الذي يوضح كيفية إضافة إدخال قرص مضغوط موسيقي جديد:

Var NewNode: IXMLDOMNode ؛ الطفل: IXMLDOMNode ؛ ... // إنشاء فرع جديد - NewNode: = XMLDoc.CreateNode (1، "CD"، "")؛ // أضف عنصرًا الطفل: = XMLDoc.CreateNode (1، "TITLE"، "")؛ // إضافة عنصر NewNode.AppendChild (طفل) ؛ // وحدد قيمته Child.Text: = "بينك فلويد" ؛ // أضف عنصرًا <ARTIST>الطفل: = XMLDoc.CreateNode (1، "ARTIST"، "")؛ // إضافة عنصر NewNode.AppendChild (طفل) ؛ // وحدد قيمته Child.Text: = "Division Bell"؛ // أضف عنصرًا <COUNTRY>الطفل: = XMLDoc.CreateNode (1، "COUNTRY"، "")؛ // إضافة عنصر NewNode.AppendChild (طفل) ؛ // وحدد قيمته Child.Text: = "UK"؛ // أضف عنصرًا <COMPANY>الطفل: = XMLDoc.CreateNode (1، "COMPANY"، "")؛ // إضافة عنصر NewNode.AppendChild (طفل) ؛ // وحدد قيمته Child.Text: = "EMI Records Ltd." ؛ // أضف عنصرًا <PRICE>الطفل: = XMLDoc.CreateNode (1، "PRICE"، "")؛ // إضافة عنصر NewNode.AppendChild (طفل) ؛ // وقم بتعيين قيمته Child.Text: = '11 .99 "؛ // أضف عنصرًا <YEAR>الطفل: = XMLDoc.CreateNode (1، "YEAR"، "")؛ // إضافة عنصر NewNode.AppendChild (طفل) ؛ // وحدد قيمته Child.Text: = "1994" ؛ // وإضافة فرع Root.AppendChild (NewNode) ؛ ...</p><p>يوضح الكود أعلاه الخطوات التالية لإضافة فرع جديد:</p> <ul><li>إنشاء فرع جديد باستخدام طريقة CreateNode: <ul><li>إنشاء عنصر باستخدام طريقة CreateNode ؛</li> <li>إضافة عنصر إلى فرع باستخدام طريقة AppendChild ؛</li> <li>تحديد قيمة عنصر من خلال خاصية النص ؛</li> <li>... كرر لجميع العناصر.</li> </ul></li> <li>إضافة فرع جديد إلى المستند باستخدام طريقة AppendChild.</li> </ul><p>تذكر أن طريقة AppendChild تضيف فرعًا إلى نهاية الشجرة. لإضافة فرع إلى مكان معين في الشجرة ، تحتاج إلى استخدام طريقة InsertBefore.</p> <h2>مجموعة فرعية - كائن XMLDOMNodeList</h2> <p>يحتوي كائن XMLNodeList على قائمة من الفروع ، والتي يمكن إنشاؤها باستخدام أساليب SelectNodes أو GetElementsByTagName ، كما تم الحصول عليها من خاصية ChildNodes.</p> <p>لقد ناقشنا بالفعل استخدام هذا الكائن في المثال المقدم في قسم "التنقل في شجرة المستند". فيما يلي بعض التعليقات النظرية.</p> <p>يمكن الحصول على عدد الفروع في القائمة كقيمة لخاصية الطول. تتم فهرسة الفروع من 0 إلى الطول -1 ، ويمكن الوصول إلى كل فرع فردي من خلال العنصر المفهرس المقابل في مصفوفة الصنف.</p> <p>يمكن أيضًا التنقل عبر قائمة الفروع باستخدام طريقة NextNode ، والتي تُرجع الفرع التالي في القائمة ، أو Nil إذا كان الفرع الحالي هو الأخير. للعودة إلى أعلى القائمة ، اتصل بطريقة إعادة الضبط.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>إنشاء المستندات وحفظها</h2> <p>لذلك ، قمنا بتغطية كيفية إضافة الفروع والعناصر إلى مستندات XML الموجودة. لنقم الآن بإنشاء مستند XML سريعًا. بادئ ذي بدء ، تذكر أنه يمكن تحميل المستند ليس فقط من عنوان URL ، ولكن أيضًا من سلسلة عادية. يوضح ما يلي كيفية إنشاء عنصر جذر ، والذي يمكن استخدامه بعد ذلك لبناء بقية العناصر ديناميكيًا (والتي غطيناها بالفعل في قسم "معالجة الفروع الفرعية"):</p><p>Var XMLDoc: IXMLDOMDocument ؛ الجذر: IXMLDOMNode ؛ العقدة: IXMLDOMNode ؛ S: WideString ؛ ... S: = ' <CATALOG></CATALOG>"؛ XMLDoc: = CoDOMDocument.Create ، XMLDoc.Async: = خطأ ، XMLDoc.LoadXML (S) ، الجذر: = XMLDoc.DocumentElement ؛ العقدة: = XMLDoc.CreateNode (1، "CD"، "")؛ Root.AppendChild (عقدة) ؛ Memo1.Lines.Add (XMLDoc.XML) ، ... XMLDoc: = لا شيء ؛</p><p>بعد بناء مستند XML ، احفظه في ملف باستخدام طريقة الحفظ. على سبيل المثال:</p> <p>XMLDoc.Save ('C: \ DATA \ NEWCD.XML') ؛</p> <p>بالإضافة إلى الحفظ إلى ملف ، تسمح لك طريقة Save بحفظ مستند XML في كائن XMLDOMDocument جديد. في هذه الحالة ، تتم معالجة المستند بالكامل ، ونتيجة لذلك ، يتم التحقق من بنيته وصياغته. فيما يلي كيفية حفظ مستند في كائن آخر:</p><p>الإجراء TForm1.Button2Click (المرسل: TObject) ؛ var XMLDoc2: IXMLDOMDocument ؛ بدء XMLDoc2: = CoDOMDocument.Create ؛ XMLDoc.Save (XMLDoc2) ، Memo2.Lines.Add (XMLDoc2.XML) ، ... XMLDoc2: = لا شيء ؛ نهاية؛</p><p>في الختام ، يسمح لك أسلوب الحفظ أيضًا بحفظ مستند XML في كائنات COM الأخرى التي تدعم واجهات IStream أو IPersistStream أو IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>استخدام قوالب XSL</h2> <p>عند مناقشة طريقة SelectNodes لكائن XMLDOMNode ، ذكرنا أنها توفر طريقة أكثر مرونة للوصول إلى فروع المستندات. المرونة هي أنه يمكنك تحديد نموذج XSL كمعايير لاختيار الفروع. توفر هذه القوالب آلية قوية للعثور على المعلومات في مستندات XML. على سبيل المثال ، للحصول على قائمة بجميع عناوين الأقراص المضغوطة الموسيقية الموجودة في دليلنا ، يمكنك تشغيل الاستعلام التالي:</p><p>لمعرفة أقراص الفنانين التي تم إصدارها في الولايات المتحدة الأمريكية ، يتم تشكيل الطلب على النحو التالي:</p><p>العقد: = Root.SelectNodes ("CD / ARTIST") ؛</p><p>إليك كيفية العثور على محرك الأقراص الأول في الدليل:</p><p>العقد: = Root.SelectNodes ("CD / TITLE") ؛</p><p>وأخيرا:</p><p>العقد: = Root.SelectNodes ("CD / TITLE") ؛</p><p>للعثور على أقراص Bob Dylan ، يمكنك تشغيل الاستعلام التالي:</p><p>العقد: = Root.SelectNodes ("CD [$ any $ ARTIST =" Bob Dylan "] / TITLE") ؛</p><p>وللحصول على قائمة الأقراص التي تم إنشاؤها بعد عام 1985 ، نقوم بتشغيل الاستعلام التالي:</p><p>العقد: = Root.SelectNodes ("CD / TITLE") ؛</p><p>تتطلب مناقشة أكثر تفصيلاً لبناء جملة XSL منشورًا منفصلاً. لإثارة اهتمام القراء وتشجيع المزيد من البحث ، سأقدم مثالًا صغيرًا واحدًا فقط عن الاستخدام المحتمل لـ XSL. لنفترض أننا بحاجة إلى تحويل دليلنا إلى جدول HTML عادي. باستخدام الطرق التقليدية ، يجب علينا التكرار على جميع فروع الشجرة ولكل عنصر مستلم يشكل العلامات المقابلة <TD>…</TD>.</p> <p>باستخدام XSL ، نقوم ببساطة بإنشاء قالب (أو ورقة أنماط) تحدد ماذا وكيف نقوم بالتحويل. ثم نقوم بتراكب هذا القالب في الكتالوج الخاص بنا - وقد انتهينا: هذا هو نص قالب XSL الذي يحول الكتالوج إلى جدول (القائمة 2).</p> <p>يبدو الكود الخاص بتراكب نموذج XSL في دليلنا كما يلي:</p><p>الإجراء TForm1.Button2Click (المرسل: TObject) ؛ فار XSLDoc: IXMLDOMDocument ؛ يبدأ XSLDoc: = CoDOMDocument.Create ؛ XSLDoc.Load ("C: \ DATA \ DATA.xsl") ؛ Memo2.Text: = XMLDoc.TransformNode (XSLDoc) ، XSLDoc: = لا شيء ؛ نهاية؛</p><p>في ختام مناقشتنا حول XSL ، ينبغي أن يقال أنه في الوقت الحالي يتم استخدام هذه اللغة بنشاط للتحول بين مستندات XML المختلفة ، وكذلك لتنسيق المستندات.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>استنتاج</h2> <p>لأسباب واضحة ، من المستحيل تغطية كافة كائنات Microsoft XML DOM وتقديم أمثلة لاستخدامها في مقال واحد. هنا تطرقنا للتو إلى المشكلات الأساسية لاستخدام XML DOM في التطبيقات. طاولة 3 يعرض جميع الكائنات المنفذة في Microsoft XML DOM.</p> <p>كمبيوتر برس 12 "2000</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy loading=lazy>");</script> </div> </div> </div> </div> <aside class="col-lg-4 col-md-12 col-md-offset-4 col-lg-offset-0" id="right"> <div> </div> <br/> <div> </div> <br/> <div> </div> <br/> <div> </div> <br/> </aside> </div> </div> </div> <div class="popup" id="share"> <div class="perfect-scroll" style="text-align: center"> <div style="margin-bottom: 20px"> <strong>سيبدأ التنزيل الآن ...</strong> <br>لا تنسى مشاركة المواد <br>على الشبكات الاجتماعية مع الخاص بك <br>زملاء</div> <div> <div class="ya-share2" data-services="vkontakte,facebook,odnoklassniki,moimir,gplus" data-counter=""></div> </div> </div> <div class="close-pop pull-right"> <svg width="10px" height="10px" viewBox="0 0 10 10"> <path fillrule="evenodd" d="M 6.41 5C 6.41 5 9.24 7.83 9.24 7.83 9.63 8.22 9.63 8.85 9.24 9.24 8.85 9.63 8.22 9.63 7.83 9.24 7.83 9.24 5 6.41 5 6.41 5 6.41 2.17 9.24 2.17 9.24 1.78 9.63 1.15 9.63 0.76 9.24 0.37 8.85 0.37 8.22 0.76 7.83 0.76 7.83 3.59 5 3.59 5 3.59 5 0.76 2.17 0.76 2.17 0.37 1.78 0.37 1.15 0.76 0.76 1.15 0.37 1.78 0.37 2.17 0.76 2.17 0.76 5 3.58 5 3.58 5 3.58 7.83 0.76 7.83 0.76 8.22 0.37 8.85 0.37 9.24 0.76 9.63 1.15 9.63 1.78 9.24 2.17 9.24 2.17 6.41 5 6.41 5Z"></path> </svg> </div> </div> <section id="views"> <div class="container"> </div> </section> <script type="text/javascript"> $(document).ready( function () { $('.kursiv').readmore({ speed: 75, maxHeight: 84, heightMargin: 16, moreLink: '<a href="#"><span>Показать полностью</span>', lessLink: '<a href="#"><span>Скрыть</span></a>', } ); } ); </script> <style> div.kursiv { margin-bottom: 0; } #razrabotka { margin-top: 30px; } .readmore-js-toggle { font-style: italic; color: #999; display: inline; margin-right: 10px; font-size: 14px; cursor: pointer; border-bottom: 1px dotted #e6e6e6; } </style></section> <footer> <div class="container"> <div class="row"> <div class="col-xs-16 col-sm-4 col-md-3"> <p>© 2021، mkr-novo2.ru، الإنترنت. تعليم. البرامج. البرامج الثابتة. التثبيت والتكوين. الملاحون</p> <div class="social"> <a target="_blank" href=""> <svg width="32px" height="19px" viewBox="0 0 32 19"> <path fillRule="evenodd" d="M 15.36 18.01C 15.36 18.01 17.24 18.01 17.24 18.01 17.24 18.01 17.81 17.94 18.1 17.64 18.36 17.37 18.35 16.85 18.35 16.85 18.35 16.85 18.32 14.41 19.49 14.05 20.64 13.7 22.12 16.4 23.69 17.45 24.87 18.23 25.77 18.06 25.77 18.06 25.77 18.06 29.97 18.01 29.97 18.01 29.97 18.01 32.16 17.87 31.12 16.21 31.03 16.07 30.51 14.97 28 12.72 25.37 10.35 25.72 10.74 28.89 6.65 30.82 4.16 31.59 2.65 31.35 2 31.12 1.38 29.7 1.54 29.7 1.54 29.7 1.54 24.98 1.57 24.98 1.57 24.98 1.57 24.63 1.52 24.37 1.67 24.12 1.82 23.95 2.16 23.95 2.16 23.95 2.16 23.21 4.09 22.21 5.72 20.11 9.18 19.27 9.36 18.92 9.15 18.12 8.65 18.32 7.14 18.32 6.07 18.32 2.72 18.85 1.32 17.3 0.96 16.79 0.84 16.41 0.76 15.1 0.75 13.41 0.73 11.99 0.76 11.18 1.14 10.64 1.39 10.23 1.96 10.48 1.99 10.79 2.03 11.5 2.18 11.88 2.67 12.36 3.31 12.34 4.74 12.34 4.74 12.34 4.74 12.62 8.68 11.69 9.17 11.06 9.5 10.18 8.82 8.31 5.68 7.35 4.08 6.62 2.3 6.62 2.3 6.62 2.3 6.48 1.97 6.23 1.8 5.93 1.58 5.51 1.51 5.51 1.51 5.51 1.51 1.02 1.54 1.02 1.54 1.02 1.54 0.35 1.56 0.1 1.84-0.12 2.09 0.08 2.62 0.08 2.62 0.08 2.62 3.6 10.57 7.57 14.57 11.22 18.25 15.36 18.01 15.36 18.01 15.36 18.01 15.36 18.01 15.36 18.01Z"/> </svg> </a> <a target="_blank" href=""> <svg viewBox="0 0 25 25" width="25px" height="25px"> <path class="st0" d="M12.5,12.7c3.2,0,5.8-2.6,5.8-5.8c0-3.2-2.6-5.8-5.8-5.8C9.3,1,6.7,3.6,6.7,6.8C6.7,10,9.3,12.7,12.5,12.7z M12.5,3.9c1.6,0,2.9,1.3,2.9,2.9c0,1.6-1.3,2.9-2.9,2.9c-1.6,0-2.9-1.3-2.9-2.9C9.6,5.2,10.9,3.9,12.5,3.9z M19.2,13.4 c-0.3-0.7-1.2-1.2-2.5-0.3c-1.6,1.3-4.3,1.3-4.3,1.3s-2.6,0-4.3-1.3c-1.2-1-2.1-0.4-2.5,0.3c-0.6,1.2,0.1,1.7,1.5,2.7 c1.3,0.8,3,1.1,4.1,1.2l-0.9,0.9c-1.3,1.3-2.6,2.6-3.4,3.4c-0.5,0.5-0.5,1.4,0,1.9l0.2,0.2c0.5,0.5,1.4,0.5,1.9,0l3.4-3.4 c1.3,1.3,2.6,2.6,3.4,3.4c0.5,0.5,1.4,0.5,1.9,0l0.2-0.2c0.5-0.5,0.5-1.4,0-1.9l-3.4-3.4l-0.9-0.9c1.1-0.1,2.8-0.4,4.1-1.2 C19.2,15.1,19.8,14.5,19.2,13.4z"/> </svg> </a> <a target="_blank" href="https://facebook.com/"> <svg width="26px" height="25px" viewBox="0 0 26 25"> <path fillRule="evenodd" d="M 24.33-0C 24.33-0 1.96-0 1.96-0 1.19-0 0.57 0.62 0.57 1.38 0.57 1.38 0.57 23.62 0.57 23.62 0.57 24.38 1.19 25 1.96 25 1.96 25 14 25 14 25 14 25 14 15.32 14 15.32 14 15.32 10.72 15.32 10.72 15.32 10.72 15.32 10.72 11.54 10.72 11.54 10.72 11.54 14 11.54 14 11.54 14 11.54 14 8.76 14 8.76 14 5.53 15.98 3.77 18.88 3.77 20.27 3.77 21.46 3.88 21.81 3.92 21.81 3.92 21.81 7.3 21.81 7.3 21.81 7.3 19.8 7.3 19.8 7.3 18.22 7.3 17.92 8.04 17.92 9.13 17.92 9.13 17.92 11.54 17.92 11.54 17.92 11.54 21.68 11.54 21.68 11.54 21.68 11.54 21.19 15.32 21.19 15.32 21.19 15.32 17.92 15.32 17.92 15.32 17.92 15.32 17.92 25 17.92 25 17.92 25 24.33 25 24.33 25 25.09 25 25.71 24.38 25.71 23.62 25.71 23.62 25.71 1.38 25.71 1.38 25.71 0.62 25.09-0 24.33-0Z"/> </svg> </a> <a target="_blank" href="https://youtube.com/"> <svg width="26px" height="19px" viewBox="0 0 26 19"> <path fillRule="evenodd" d="M 25.75 14.46C 25.75 14.46 25.5 16.18 24.75 16.93 23.79 17.92 22.72 17.93 22.23 17.99 18.71 18.24 13.43 18.25 13.43 18.25 13.43 18.25 6.89 18.19 4.88 18 4.32 17.89 3.06 17.92 2.11 16.93 1.35 16.18 1.11 14.46 1.11 14.46 1.11 14.46 0.86 12.45 0.86 10.44 0.86 10.44 0.86 8.55 0.86 8.55 0.86 6.54 1.11 4.52 1.11 4.52 1.11 4.52 1.35 2.81 2.11 2.05 3.06 1.06 4.14 1.06 4.63 1 8.15 0.75 13.42 0.75 13.42 0.75 13.42 0.75 13.43 0.75 13.43 0.75 13.43 0.75 18.71 0.75 22.23 1 22.72 1.06 23.79 1.06 24.75 2.05 25.5 2.81 25.75 4.52 25.75 4.52 25.75 4.52 26 6.54 26 8.55 26 8.55 26 10.44 26 10.44 26 12.45 25.75 14.46 25.75 14.46ZM 10.83 5.73C 10.83 5.73 10.83 12.72 10.83 12.72 10.83 12.72 17.62 9.24 17.62 9.24 17.62 9.24 10.83 5.73 10.83 5.73Z"/> </svg> </a> </div> </div> <div class="col-lg-2 col-sm-4 col-xs-16 links"> <h4>mkr-novo2.ru</h4> <a href="https://mkr-novo2.ru/ar/category/internet/">إنترنت</a> <a href="https://mkr-novo2.ru/ar/category/multimedia/">الوسائط المتعددة</a> <a href="https://mkr-novo2.ru/ar/category/navigation/">الملاحون</a> <a href="https://mkr-novo2.ru/ar/category/education/">تعليم</a> <a href="https://mkr-novo2.ru/ar/category/at/">تشغيل</a> <a href="https://mkr-novo2.ru/ar/category/problems/">مشاكل</a> </div> <div class="col-lg-2 col-sm-3 col-xs-16 links"> <h4>حول المشروع</h4> <a href="">استجابة</a> <a href="">عن الموقع</a> </div> <div class="col-lg-5 col-sm-1 col-xs-16 links"></div> <div class="col-lg-4 col-sm-5 col-xs-16 links"> </div> </div> <div class="row v-center"> <div class="col-md-8 col-xs-16"> <a data-fancybox data-type="iframe" data-src="">جهات الاتصال</a> </div> <div class="col-md-8 col-xs-16"> <div class="share pull-right"> <script type="text/javascript" src="//yastatic.net/es5-shims/0.0.2/es5-shims.min.js" charset="utf-8"></script> <script type="text/javascript" src="//yastatic.net/share2/share.js" charset="utf-8"></script> <div class="ya-share2" data-services="vkontakte,facebook,odnoklassniki,moimir,gplus" data-counter=""></div> </div> </div> </div> </div> </footer> <a href="#bot" id="to-top"> <svg width="50px" height="50px" viewBox="0 0 50 50"> <circle cx="25.00" cy="25.00" r="25.00" fill="rgb(0,0,0)" opacity="0.37"/> <path fillRule="evenodd" d="M 33.94 24.46C 33.94 24.46 25.89 16.3 25.89 16.3 25.32 15.73 24.41 15.73 23.84 16.3 23.84 16.3 15.79 24.46 15.79 24.46 14.88 25.38 15.52 26.97 16.81 26.97 16.81 26.97 20.43 26.97 20.43 26.97 21.23 26.97 21.88 27.62 21.88 28.43 21.88 28.43 21.88 32.51 21.88 32.51 21.88 33.71 22.83 34.68 24.01 34.68 24.01 34.68 25.72 34.68 25.72 34.68 26.9 34.68 27.86 33.71 27.86 32.51 27.86 32.51 27.86 28.43 27.86 28.43 27.86 27.62 28.5 26.97 29.31 26.97 29.31 26.97 32.92 26.97 32.92 26.97 34.21 26.97 34.85 25.38 33.94 24.46Z" fill="rgb(241,241,241)"/> </svg> </a> <div class="overlay"></div> <div class="popup" id="password"> <div class="perfect-scroll"> <h2>استعادة كلمة السر <div class="close-pop pull-right"> <svg width="10px" height="10px" viewBox="0 0 10 10"> <path fillRule="evenodd" d="M 6.41 5C 6.41 5 9.24 7.83 9.24 7.83 9.63 8.22 9.63 8.85 9.24 9.24 8.85 9.63 8.22 9.63 7.83 9.24 7.83 9.24 5 6.41 5 6.41 5 6.41 2.17 9.24 2.17 9.24 1.78 9.63 1.15 9.63 0.76 9.24 0.37 8.85 0.37 8.22 0.76 7.83 0.76 7.83 3.59 5 3.59 5 3.59 5 0.76 2.17 0.76 2.17 0.37 1.78 0.37 1.15 0.76 0.76 1.15 0.37 1.78 0.37 2.17 0.76 2.17 0.76 5 3.58 5 3.58 5 3.58 7.83 0.76 7.83 0.76 8.22 0.37 8.85 0.37 9.24 0.76 9.63 1.15 9.63 1.78 9.24 2.17 9.24 2.17 6.41 5 6.41 5Z"/> </svg> </div> </h2> <div class="recover-success"> <form action="/recovery/request" data-method="post" method="post" class="recover_form"> <p>أدخل بريدك الإلكتروني لاستعادة كلمة المرور الخاصة بك!</p> <div class="input-wrp"> <input name="email" type="text" placeholder="أدخل بريدك الإلكتروني"> </div> <input type="submit" data-disable-with="Отправить..." class="btn green" value="يرسل"> </form> </div> <div class="auth-form_error" style="padding-top: 10px"></div> </div> </div> <script> $('.user.one').click(function (e, ob) { $('.user').removeClass('active-user'); $('.user.one').addClass('active-user'); $('#user_type').val('1'); e.stopPropagation(); } ); $('.user.two').click(function (e, ob) { $('.user').removeClass('active-user'); $('.user.two').addClass('active-user'); $('#user_type').val('2'); e.stopPropagation(); } ); $('.user.three').click(function (e, ob) { $('.user').removeClass('active-user'); $('.user.three').addClass('active-user'); $('#user_type').val('3'); e.stopPropagation(); } ); function clearErrors() { $('.auth-form_error').each(function () { $(this).html(''); } ); } $('body').on('click', '.open-login-form', function (e) { $('#register, .overlay').removeClass('visible-pop'); $('#login, .overlay').addClass('visible-pop'); e.preventDefault(); } ); $('body').on('click', '.open-pass-form', function (e) { $('#register, .overlay').removeClass('visible-pop'); $('#password, .overlay').addClass('visible-pop'); e.preventDefault(); } ); $('.login_form') .on('ajax:beforeSend', function (event, xhr, settings) { clearErrors(); } ) .on('ajax:complete', function (event, xhr, status) { } ) .on('ajax:success', function (event, data, status, xhr) { if (data.status == 0) { $('.auth-form_error').html(data.text + '<br>'); } else { $('.open-register').html(data.text); var delay = 1000; window.location.href = url = window.location.href + "?login=ok"; location.replace(url); setTimeout('window.location.reload(true);', delay); } } ).on('ajax:error', function (event, xhr, status, error) { } ); $('.recover_form') .on('ajax:beforeSend', function (event, xhr, settings) { clearErrors(); } ) .on('ajax:complete', function (event, xhr, status) { } ) .on('ajax:success', function (event, data, status, xhr) { console.log(data); if (data.status == 0) { $('.auth-form_error').html(data.text + '<br>'); } else { $('.recover-success').html('<div class="success" >' + data.text + '</div>'); } } ).on('ajax:error', function (event, xhr, status, error) { } ); $('.registration_form') .on('ajax:beforeSend', function (event, xhr, settings) { var emailError = $('#emailError'); var passwordError = $('#passwordError'); var passwordVerify = $('#passwordVerifyError'); var userTypeError = $('#userTypeError'); var emailExist = $('#emailExist'); emailError.html(''); passwordError.html(''); passwordVerify.html(''); userTypeError.html(''); emailExist.hide(); } ) .on('ajax:complete', function (event, xhr, status) { } ).on('ajax:success', function (event, data, status, xhr) { // insert the failure message inside the "#account_settings" element //console.log(data); if (data.status == 0) { //$('.reg-info').html('<div class="error">' + data.text + '</div>'); if (data.text.email) { var emailError = $('#emailError'); var emailExist = $('#emailExist'); console.log(data.text.email); if (data.text.email == 'Найдена совпадающая со значением запись') { console.log('alert'); emailExist.show(); } else { emailError.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.email + '</span></div></div>'); } } if (data.text.password) { var passwordError = $('#passwordError'); console.log(data.text.password); passwordError.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.password + '</span></div></div>'); } if (data.text.passwordVerify) { var passwordVerify = $('#passwordVerifyError'); console.log(data.text.passwordVerify); passwordVerify.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.passwordVerify + '</span></div></div>'); } if (data.text.captcha) { var captcha = $('#captchaError'); console.log(data.text.captcha); captcha.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.captcha + '</span></div></div>'); } if (data.text.userType) { var user_type = $('#userTypeError'); console.log(data.text.userType); user_type.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.userType + '</span></div></div>'); } } else { $('.reg-success').html(data.text); var delay = 2000; window.location.href = url = window.location.href + "?reg=ok"; location.replace(url); setTimeout('window.location.reload(true);', delay); } } ).on('ajax:error', function (event, xhr, status, error) { } ); </script> <div class="popup" id="premium-pop"> </div> <link rel="stylesheet" href="/videouroki/res/lightslider/lightslider.min.css"> <link rel="stylesheet" href="/videouroki/res/perfectScrollbar/perfect-scrollbar.css"> <link rel="stylesheet" href="/videouroki/assets/font-awesome/css/font-awesome.min.css"> <link rel="stylesheet" href="/assets/vendor/fancybox/jquery.fancybox.min.css"> <script src="/videouroki/res/perfectScrollbar/perfect-scrollbar.jquery.min.js"></script> <script src="/js/rails.js"></script> <script src="/videouroki/res/lightslider/lightslider.min.js"></script> <script src="/videouroki/res/jquery.validate.min.js"></script> <script src="/videouroki/res/autosize-master/autosize.min.js"></script> <script src="/videouroki/js/tabs.js"></script> <script src="/videouroki/js/select.js"></script> <script src="/videouroki/js/global.js?2109"></script> <script src="/videouroki/js/views.js"></script> <script src="/videouroki/plugin/notify/notify.min.js"></script> <script src="/videouroki/plugin/notify/notify-metro.js"></script> <script src="/videouroki/js/lazyload.min.js"></script> <script src="/assets/vendor/fancybox/jquery.fancybox.min.js"></script> <script type="text/javascript"> $(document).ready( function () { // new LazyLoad(); } ) </script> <!--[if gte IE 9]><script type="text/javascript" src="/videouroki/assets/ckeditor-mini/ckeditor.js"></script><![endif]--> <script type="text/javascript" src="/videouroki/js/readmore.js"></script></body> </html>