|
#1
|
||||
|
||||
الدرس الحادي عشر : التعامل مع ملفات XML - دورة CSharp 2005
الدرس الحادي عشر دوارة While في الدرس الرابع تعرفنا على هيكل من هياكل التكرار في لغة C# وهو دوارة for والحقيقة أن هناك هياكل أخرى من هياكل التكرار أهمها هي دوارة While وهي تشبة إلى حد كبير دوارة for بإختلاف أنها لا تحتوي على عداد Counter كما كنا نعرف i في دوارة for والهيكل الأساسي لدوارة While يشبة إلى حد كبير هيكل for بإختلاف أشياء بسيطة : كود PHP:
كود PHP:
حيث عرفنا متغير من نوع رقم n وأسندنا له قيمة إبتدائية 0 وشرط التكرار في الدوارة هو أن تكون قيمة المتغير n أصغر من 5 في المرة الأولى ستكون قيمة n هي صفر , وبالتالي فشرط التكرار متحقق , لأن الصفر أقل من 5 يتم تنفيذ كود إظهار الرسالة , والكود n++ يعني إضافة واحد إلى قيمة n أي أن n سيحمل الآن القيمة 1 يعود المعالج لبداية جملة while ويختبر شرط التكرار مرة أخرى ثم ينفذ كود إظهار الرسالة ويزيد واحد لقيمة n وهكذا حتى تصبح قيمة n=5 عندها لن يتحقق شرط التكرار لأن 5 لسيت أقل من 5 وبالتالي يقفز المعالج إلى نهاية كود الدوارة ويواصل تنفيذ التعليمات بعدها يستخدم هذا النوع من الدوارات حين لا نعرف كم بالضبط سنكرر كود الدوارة وسنستخدمها في درس اليوم حيث لدينا معلومات الألبوم ولا نعرف عدد الملفات في الألبوم كما سنشرح بالتفصيل لا حقا ملفات XML من اهم أنظمة الحاسوب التي استفادة منها الإنسانية منذ ظهور الحاسوب هي أنظمة قواعد البيانات وأنظمة قواعد البيانات هي برمجيات تستخدم مع لغات البرمجة بغرض خزن وإسترجاع أنواع متعددة من البيانات ويتم خزن هذه البيانات بطرق مرتبة ومنهجية بحيث يسهل إسترجاع بيانات محددة مهما كبير كان حجم البيانات حيث يتم ترتيب البيانات في وحدات متجانسة تسمى جداول Tables والتي تحتوي على حقول Fields لكل حقل نوع محدد من البيانات ويمكن للجدول الواحد أن يحتوي على عدة حقول من أنواع بيانات مختلفة قد ترتبط الجداول مع بعضها بواسطة علاقات Relationships حيث تعتمد بيانات من جدول على بيانات من جدول آخر أنظمة قواعد البيانات تقسم إلى قسمين , نظام الخزن , ونظام المعالجة أما نظام الخزن فهو المسئول عن خزن البيانات في ملفاتها المحددة بغض النظر عن ترتيبها أو أماكنها ونظام المعالجة هو المسئول عن تحديد أماكن البيانات الصحيحة و إسترجاعها والقيام بالعمليات عليها النظام الأول -نظام الخزن- يتكفل به نظام التشغيل ولا يحتاج لبرمجيات أو برامج خاصة أما النظام الثاني فيتطلب برمجيات محددة لنظام قواعد البيانات معظم أنظمة قواعد البيانات تستخدم النظام الثاني , مثل قواعد الأكسس و الأوراكل و غيرها هناك أنواع أخرى لا تتطلب برمجيات مخصصة للتعامل معها ومنها نظام قواعد البيانات عبر ملفات XML وهذا هو محور درسنا اليوم , حيث لا يحتاج هذا النظام لبرمجيات متخصصة للتعامل معه وإنما ملفاته عبارة عن ملفات نصية يمكن فتحها وتعديلها بأي محرر نصوص وسنستخدم ملفات XML في تطبيقنا لخزن بيانات الألبومات أو قوائم التشغيل صيغة هذه الملفات النصية تشبة إلى حد كبير صيغة ملفات HTML حيث يعتمد على وسوم Tags ترتب البيانات في هياكل مترابطة وكل جزء من البيانات يحتوي على وسم بداية ووسم نهاية وله إسم محدد فمثلاً هذا الكود : كود PHP:
يحتوي هذا الجزء على بيانات مخزنة هو كلمة "رسالة" لاحظ أن الجزء يحتوي على وسمين وسم البداية حيث يحتوي على إسم الجزء بين علامتي أصغر وأكبر من ووسم النهاية وهو مشابه تماما لوسم البداية بزيادة الشرطة المائلة / قبل إسم الجزء في وسم النهاية وبين الوسمين توجد البيانات وتسمى الأجزاء في ملفات XML بالعقد Nodes فالكود السابق يحتوي على عقدة إسمها msg سميت بالعقد لأنه يمكن لأي جزء من البيانات أن يحتوي على أجزاء أخرى : كود بلغة HTML:
<albumes> <albume1> </albume1> </albumes> يمكن أن تحتوي العقدة على عدة عقد فرعية : كود بلغة HTML:
<albumes> <albume1> </albume1> <albume2> </albume2> </albumes> يمكن أيضاً للعقدة الفرعية أن تحتوي على عقد فرعية أخرى: كود بلغة HTML:
<albumes> <albume1> <file>sound.mp3</file> <file>wave.rm</file> </albume1> <albume2> <file>real.wav</file> </albume2> </albumes> العقدة الفرعية albume1 تحتوي على عقدتين فرعيتين بنفس الإسم file كل عقدة من عقدتي file بيانات نصية sound.mp3 و wave.rm والعقدة الفرعية albume2 تحتوي على عقدة فرعية file الكود السابق يمثل ملف XML يحتوي على بيانات مرتبة في عقد , ولكن ينقصة شيئ مهم نوع التكويد في المف , ورقم إصدار كود XML , والتكويد هو أسلوب خزن البيانات النصية في الملف عادة ما نستخدم تكويد UTF-8 , وسطر نوع التكويد يجب أن يكون في بداية الملف: كود بلغة HTML:
<?xml version="1.0" encoding="utf-8"?> <albumes> <albume1> <file>sound.mp3</file> <file>wave.rm</file> </albume1> <albume2> <file>real.wav</file> </albume2> </albumes> هذا هو هيكل الملف الذي سيقوم بخزن بيانات الألبومات وقوائم التشغيل يتم التعامل مع ملف XML في البرنامج من خلال كائن XmlDocument الموجود في فضاء الأسماء System.XML: كود PHP:
الكائن doc يقوم بتحميل المف عن طريق الإجراء Load كود PHP:
يتم الوصول إلى العقد الموجوده في المف عن طريق ذكر إسم العقدة الرئيسية متبوعة بقوسين مربعين يحتويان إسم العقدة الفرعية أما إذا أردنا الوصول إلى العقد الرئيسية المسماه albumes فنكتب إسم الكائن doc متبوعاً بقوسين مربعين يحتويان إسم العقدة : كود PHP:
كود PHP:
ويتم الوصول لإسم العقدة عن طريق الخاصية :Name كود PHP:
ويتم الوصول إلى العقد الفرعية بإضافة قوسين مربعين يحتويان إسم العقدة فمثلاً للوصول إلى العقدة الفرعية albume1 الموجود في العقدة albumes : كود PHP:
كود PHP:
افتح تطبيق الدرس السابق , من نافذة مستعرض المشروع, أنقر بالزر الأيمن على إسم المشروع ومن القائمة الناتجة إختر Add ثم New Item : ستظهر نافذة إضافة ملف جديدة للمشروع , من القائمة في اليسار إختر misc ثم إختر Empty XML file , وفي صندوق إسم الملف أكتب الإسم التالي albumes.xml , وإختر OK إذهب إلى مجلد المشروع وأنسخ الملف albumes.xml إلى مجلد Debug الموجود داخل مجلد bin حيث يصبح الملف موجود بجانب ملفات المشروع الأخرى الآن قم بفتح تصميم نافذة الألبومات وسحب ثلاثة أزرار إلى النافذة وغير الأسماء فيها إلى ألبوم جديد حفظ الألبوم حذف الألبوم ومن صندوق الأدوات إسحب كائن القائمة المنسدلة إلى نافذة الالبومات : إختر كائن القائمة المنسدلة و من جدول الخصائص , غير الخاصية (Name) , إلى ac وغير الخاصية Text إلى "إختر الألبوم" قم بترتيب الأدوات في النافذة حتى تصبح هكذا : جميع الدوال التي سنستخدمها للتعامل مع ملف XML موجوده في فضاء الأسماء XML الموجود داخل الفضاء System لذلك يجب إضافة عبارة using لتعريف جميع دوال وكائنات التعامل مع ملفات XML إذهب إلى شفرة نافذة الألبومات و أكتب السطر التالي , تحت جمل using في رأس الملف: يتم تحميل ملف XML إلى البرنامج والتعامل معه من خلال كائن XmlDocument حيث سنعرف كائن عام من هذا النوع ليتم التعامل معه في جميع أنحاء نافذة الألبومات إنسخ كود التعريف تحت تعريف قائمة albume من الدرس السابق : قمنا هنا بتعريف كائن إسمه doc من نوع XmlDocument , ولأنه كائن إستخدمنا الكلمة new إجراء تحميل الألبومات للقائمة المنسدلة FillCombo يقوم هذا الإجراء بتحميل أسماء الألبومات الموجوده في ملف XML إلى القائمة المنسدلة ac قم بنسخ الكود التالي إلى شفرة نافذة الألبومات وتأكد أنه خارج أي إجراء آخر : كود PHP:
والتعليمة Application.StartupPath تعيد قيمة نصية تمثل مسار ملف exe للتطبيق حيث إستفدنا من هذه التعليمة لمعرفة مسار ملف XML وأضفنا إسم الملف للمسار في السطر الثاني قمنا بتعريف كائن من نوع عقدة XmlNode إسمه alnd ثم حملنا هذا الكائن أول عقدة فرعية داخل العقدة الرئيسية albumes من خلال الخاصية FirstChild السطر الثالث يمثل جملة while تنفذ كود الدوارة ما دامت العقدة alnd تحمل قيمة الشرط alnd!=null يختبر الكائن alnd فإذا كان يحمل قيمة غير القيمة الفارغة null فسيتم تنفيذ كود الدوارة أما إذا كان الكائن alnd لا يحمل قيمة أي أنه يحمل null فعندها لن يتم تنفيذ كود الدوارة السطر الخامس يقوم بإضافة إسم العقدة alnd إلى القائمة المنسدلة ac السطر السادس يقوم بإختيار العقدة التالية للعقدة alnd حيث يحمل الكائن alnd العقد التالية لما كان يحمله يتم تكرار السطرين السابقين حتى الوصول إلى آخر عقدة عندها سيحمل الكائن alnd القيمة null لأنه لا يوجد عقدة تالية للعقدة الأخيرة وبالتالي ينتهي تكرار جملة while لكن ماذا لو لم يكن هناك إي عقد في ملف XML , عندها سينتج خطأ من تنفيذ هذا الإجراء ولحل ذلك نستخدم عبارة try: قم بتعديل الكود السابق حتى يصبح هكذا : كود PHP:
إذا إلى تصميم نافذة الألبومات وانقر مزدوجاً على مكان فارغ في النافذة لتذهب إلى كود تحميل النافذة albumes_Load أضف إستدعاء إجراء FillCombo تحت إجراء FillView من الدرس السابق , حيث يصبح كود تحميل النافذة هكذا : كود PHP:
سيقوم هذا الإجراء بقراءة محتويات ألبوم محدد من ملف XML وتخزينها في قائمة albume ثم إستدعاء إجراء FillView لنسخ محتويات القائمة إلى كائن المستعرض lv يحتوي هذا الإجراء على مدخل من نوع نص يمثل الألبوم المختار المراد تحميل ملفاته إلى كائن المستعرض إنسخ الكود التالي إلى شفرة نافذة الألبومات وتأكد أنه خارج أي إجراء آخر: كود PHP:
السطر الخامس لتحميل ملف XML إلى الكائن doc السطر السادس عرفنا كائن من نوع عقدة يحمل أول عقدة من العقدة الفرعية التي إسمها هو المدخل والموجوده داخل العقدة الرئيسية albumes لاحظ أنا وضعنا إسم المدخل في العقدة الفرعية فعند تشغيل البرنامج سيتم إستبدالة بقيمة المدخل كما سنرى لاحقاً السطر السابق يقوم بتحديد عقدة الألبوم المدخل , مثلاً albume1 ثم أخذ أول عقدة منه file وتحميلها على الكائن filend السطر السابع قمنا بتنظيف القائمة albume من أي عناصر موجودة فيها حتى ندخل إليها العناصر الجديدة من الملف جملة while في السطر الثامن , تنفذ كود الدوارة ما دام filend لا يحمل القيمة null السطر العاشر نقوم بإضافة بيانات العقدة إلى القائمة عن طريق الخاصية InnerText في العقدة في السطر الحادي عشر نقوم بإختيار وتحميل العقدة التالية للعقدة الحالية , وهكذا حتى نصل لآخر عقدة ويتوقف تنفيذ كود الدوارة في السطر الثالث عشر نقوم بإستدعاء إجراء نسخ القائمة albume إلى كائن المستعرض lv بعد شرح هذا الإجراء بقي أن نختار المكان المناسب لإستدعائة وأفضل مكان لذلك هو عندما يختار المستخدم إسم الألبوم من القائمة المنسدلة إذهب إلى تصميم نافذة الألبومات وأنقر مزدوجاً على كائن القائمة المنسدلة ستذهي إلى الشفرة , أكتب هناك إستدعاء الأجراء ReadAlbume لا تنسى أن هذا الإجراء يتطلب مدخل من نوع نص يمثل الألبوم المختار والألبوم المختار في هذه الحالة هو النص المكتوب على كائن القائمة المنسدلة Text لذلك فإستدعاء الإجراء سيكون هكذا : كود PHP:
كود PHP:
إجراء حذف الألبوم DeleteAlbume يقوم هذا الإجراء بحذف بيانات الألبوم المختار من ملف XML حيث يتطلب مدخل واحد من نوع نص , يمثل إسم الألبوم المراد حذفة انسخ الكود التالي إلى شفرة نافذة الألبومات وتأكد من أنه خارج أي إجراء آخر : كود PHP:
السطر الخامس جملة if تقوم بإظهار رسالة تحذير للمستخدم بحيث يتم تأكيد الحذف , لاحظ عبارة إستدعاء الدالة : كود PHP:
لذلك وظيفتها هذه المرة مختلفة قليلاً , المدخل الأول هو نص الرسالة كما عرفنا سابقاً المدخل الثاني هو عنوان الرسالة الذي سيظهر في شريك العنوان المدخل الثالث MessageBoxButtons.YesNo هو الأزرار المطلوب إظهارها في الرسالة حيث إخترنا YesNo وهناك أيضاً OkCancel و هناك مجموعات أخرى من الأزرار المدخل الرابع MessageBoxIcon.Question يمثل الأيقونه المراد إظهارها في الرسالة حيث إخترنا أيقونة السؤال Question المدخل الخامس MessageBoxDefaultButton.Button2 يمثل الزر الإفتراضي , أي الزر الذي يكون التركيز عليه عند ظهور الرسالة وقد إخترنا Button2 والذي سيكون في هذه الحالة زر No حيث سيكون الجواب الإفتراضي للرسالة هو No وقد إخترنا No بدلا من Yes حتى يتأكد المستخدم من إختيارة قبل أن نحذف بيانات الألبوم وإذا كانت نتيجة هذه الرسالة هي الموافقة DialogResult.Yes سيتم تنفيذ كود الحذف وإلا فلا في السطر السابع تعليمة تحميل الملف لكائن doc وفي السطر الثامن تعلمية إزالة عقدة الألبوم , حيث يتم إزالة عقدة بتحديد عقدتها الرئيسية ثم إستدعاء الإجراء RemoveChild والعقدة الرئيسية لعقد الألبومات هي albumes لذلك تم إستدعاء إجراء الحذف منها داخل قوسي إجراء الحذف العقدة المراد حذفها , وهي العقدة الذي إسمها هو المدخل albumename الموجودة داخل العقدة الرئيسية albumes في السطر التاسع تعليمة حفظ التغييرات على ملف XML بإستدعاء الإجراء Save من كائن doc في السطر العاشر تعليمة حذف إسم الألبوم المحذوف من القائمة المنسدلة وفي السطر الحادي عشر تعليمة تنظيف كائن المستعرض lv من ملفات الألبوم المحذوف المكان المناسب لإستدعاء هذا الإجراء هو كود الزر "حذف الألبوم" إذهب إلى تصميم نافذة الألبومات وانقر مزدوجاً على زر "حذف الألبوم" وأكتب إستدعاء إجراء الحذف هناك : كود PHP:
هذا الإجراء سيقوم بتخزين محتويات كائن المستعرض lv إلى ملف XML حيث يقوم الإجراء أولاً بإنشاء عقدة الألبوم , وتسميتها بالنص المكتوب على القائمة المنسدلة ثم يقوم بإنشاء العقد الفرعية file والتي تحتوي على مسارات الملفات الموجودة في كائن المستعرض وأيضاً يقوم الإجراء بحفظ التغيرات على ألبوم موجود أساساً , بحيث يقوم بحذفة أولاً من الملف ثم تخزين ألبوم جديد بنفس الإسم وبالبيانات المعدلة إنسخ الكود التالي إلى شفرة نافذة الألبومات وتأكد من أنه خراج إلى إجراء آخر : كود PHP:
السطر الخامس تعليمة تحميل الملف إلى كائن doc السطر السادس عبارة if تختبر هل هناك عقدة للألبوم المحدد في ملف XML فإذا كانت العقدة موجودة فالسطر الثامن يقوم بحذفها , حتى توضع بدلاً منها العقدة بالبيانات المعدلة والحذف هنا هو للبيانات القديمة وخزن البيانات الجديدة كأنها إلبوم جديد بنفس الإسم أما اذا لم يكن الألبوم موجود في الملف فإن كود الحذف لن يفعل شيئاً لأنه ألوم جديد وبالتالي يضاف إسم هذا الألبوم إلى القائمة المنسدلة في السطر الثاني عشر السطر الرابع عشر عرفنا متغير من نوع عقدة إسمه albumend وأسندنا له عقدة جديدة بعد إستدعاء تعليمة إنشاء العقدة كود PHP:
السطر الخامس عشر عبارة for من الصفر إلى عدد عناصر القائمة albume لإنشاء عقد جديدة لكافة عناصرها السطر السابع عشر عرفنا متغير من نوع عقدة إسمه filend حيث سيقوم بحمل عقدة جديدة إسمها file بعد إستدعاء تعليمة إنشاء العقدة كود PHP:
بقي أن ندخل البيانات إلى العقدة file السطر الثامن عشر عرفنا متغير من نوع عقدة وحملناه قيمة نصية من خلال إستدعاء إجراء إنشاء عقدة نصية كود PHP:
الآن أصبح لدينا ثلاث عقد عقدة albumend التي تحمل إسم الألبوم , والعقدة filend التي تحمل إسم file وعقدة path التي تحمل مسار الملف من عنصر القائمة albume إلى الآن لم يتم ربط العقد ببعضها البعض فهي إلى حد الآن عقد مستقلة ومنفصلة يتم ربط عقدة فرعية بعقدة رئيسية من خلال إستدعاء الإجراء AppendChild من العقدة الرئيسية وتمرير العقدة الفرعية كمدخل لهذا الإجراء , حيث في السطر التاسع عشر ربطنا العقدة path بعقدة filend وأصبحت العقدة file تحتوي على بيانات , ثم في السطر العشرين ربطنا العقدة filend بما فيها بالعقدة albumend وبتكرار العملية لكافة عناصر القائمة albume ستنتج لنا عقدة رئيسية إسمها بإسم المدخل albumename تحتوي على عدة عقدة فرعية file تحتوي على مسارات الملفات في الألبوم لاحظ أن عقدة الألبوم حتى الآن لم ترتبط بعقدة رئيسية , بل ربطناها بعقد فرعية فقط في السطر التانب والعشرين ربطنا العقدة albumend بالعقدة الرئيسية في الملف albumes وبهذا أصبح لدينا جميع العقد متصلة ومترابطة مع بعض ولم يبقى سوى حفظ التغيرات إلى الملف في السطر الثالث والعشرين بقي أن نحدد مكان إستدعاء هذا الإجراء , إذهب إلى تصميم نافذة الأبومات وأنقر مزدوجاً على زر "حفظ الألبوم" ستنتقل إلى الشفرة , أكتب هذا : كود PHP:
وأكتب داخلة هذه التعليمات : كود PHP:
وفي السطر الثاني قمنا بتنظيف القائمة albume من أي عناصر موجودة مسبقاً وفي السطر الثالث قمنا بتصفير النص المكتوب على القائمة المنسدلة , بحيث اصبح كل شيئ جاهز لإنشاء ألبوم جديد شغل البرنامج الآن وقم بتجريب حفظ ألبوم و إسترجاع بياناته ملاحظة: عند أنشاء ألبوم جديد تأكد من أن إسم الألبوم لا يحتوي على فراغات أو رموز غريبة لأن أسماء العقد يجب أن لا تحتوي على فراغات أو رموز غريبة وإلا ظهرت رسالة الخطأ . الواجب أرسل التطبيق .نهاية الدرس الحادي عشر. ..
|
|
|
المواضيع المتشابهه | ||||
الموضوع | كاتب الموضوع | المنتدى | مشاركات | آخر مشاركة |
الدرس العاشر : التعامل مع أكثر من نافذة - دورة CSharp 2005 | khaledbelal | دورة CSharp 2005 من منتديات المشاغب | 0 | 03-22-2010 04:02 PM |
الدرس السادس : تشغيل ملفات الريال بلاير - دورة CSharp 2005 | khaledbelal | دورة CSharp 2005 من منتديات المشاغب | 0 | 03-22-2010 03:32 PM |
الدرس الخامس : تشغيل ملف فيديو - دورة CSharp 2005 | khaledbelal | دورة CSharp 2005 من منتديات المشاغب | 0 | 03-22-2010 03:26 PM |
الدرس الرابع : الإجراءات والدوال - دورة CSharp 2005 | khaledbelal | دورة CSharp 2005 من منتديات المشاغب | 0 | 03-19-2010 03:39 PM |
الدرس الثاني : المتغيرات - دورة CSharp 2005 | khaledbelal | دورة CSharp 2005 من منتديات المشاغب | 0 | 03-12-2010 03:56 PM |