بسم الله الرحمن الرحيم,
أولا: لكي تستطيع فهم هذا الموضوع يجب ان تكون تعاملت مع الـ object oriented من قبل.
ثانيا: معرفة التعامل مع ال stacks و ال .trees
ثالثا: هذا الموضوع يحتاج كتاب كامل, لذا سوف احاول ان اختصر, فسامحوني اذا كان هناك أي تقصير, و ارجو تنبيهي.
أريد اليوم أن أتطرق الى موضوع مهم جدا لجميع المبرمجين, الا وهو الـ XML and c++
أولا ابدأ باعطاء فكرة بسيطه جدا عن الـ XML :(Extensible Markup Language)
هي طريقه لتنظيم البيانات أكثر من كونها لغة برمجه, فاذا اردنا قرأت المعلومات المحتوى في ال XML, تكون العمليه سهل جدا و سريعة بعكس ال txt
أعلم ان مثالا قد يوضح الصورة بشكل جيد:
لنفرض انه لدينا قائمة من ارقام هواتف أصحابنا بهذا الشكل:
عماد أيمن زعبلاوي, 21 سنه,ساكن بالشارقه, سوري الجنسيه
او
Imad ayman zabalawi, 21years old, living in sharjah, nationality is Syrian
اذا كانت هذه المعلومات موجوده في txt file و اردنا البحث عن جنسية عماد, وجب علينا قرأة كل كلمة حتى نصل الى كلمة Syrian وهذا طبعا مضيعه للوقت و الجهد.
للنأخذ نظره على الـ XML كيف يعرض البيانات, هذه المعلومات توضع بهذا الشكل:
<friend> <name> imad ayman zabalawi </name> <age>21</age> <living>sharjah</living> <nationality>Syrian</ nationality> </friend>
بهذا الشكل الـ compiler سوف يبحث عن nationality و يعطيك Syrian بدون المرور على كل كلمة , فهو لو قرأ كلمة name مثلا, سوف يفهم ان الـجنسيه ليست بهذا السطر و بهذا ينتقل الى السطر التالي.
أرجو ان تكون الصورة اصبحت واضحه,
التعامل مع ال XML عن طريق ال c++ أو ما يسمى بـ "parsing":
هناك طريقتان للتعامل مع ال XML
1) DOM (Document Object Model): هذه الطريقه تقوم بوضع المعلومات الموجوده بالـ XML file على هيئة tree, استخدام مبدأ الـ parent and child, و عندما تبحث او تقرأ او تضيف أي معلومه بالXML, عمليا تقوم بالدخول الى ال tree و التعامل معها.
2) SAX (Simple API for XML): هذه الطرقه تقوم باستدعاء دوال معرفه في ال class المكون, و هذه الدوال تقوم بخدمة المستخدم, وقد يختلف تعريف هذه الدوال من مبرمج الى اخر.
رغم الاحتلاف بين هذه الطريقتين, الا انها بالنهايه تقوم بنفس الوظيفه.
- بعض المبرمجين يفضل ال SAX حيث انها لا تشغل الذاكرة كما هو الحال في DOM بتكوين tree, و خصوصا في الملفات كبيرة الحجم.
- و البعض الاخر (الذي انا اتوافق معه) هو استخدام الاثنان معا (DOM and SAX).
و هناك كتب كامله و دراسات تدور حول البحث عن افضل طريقه بين هاتين الطريقتين.
لقد قمت بتكوين two classes واحد للقرأه و الاخر للكتابه.
كيفية تكوين ال XML file : أحدى الطرق هي فتح ملف notepad ومن ثم حفظ الملف بامتداد xml, يعني بهذا الشكل:
Imad.xml
وطريقة عرضه: اما عن طريق ال internet explorer 5.5 or any version above it او عن طريق الfront page
كيفية تكون ملف xml و الكتابه فيه عن طريق الـ c++ :
ملاحظات هامة:
التعامل مع الـ XML باللغة الـ java اسهل بكثير, لكن كما نعلم ان ال c++ لغة قوية جدا, لذا يجب ان نتعرف عليها.
الأكواد التي سوف اضعها, غير كامله و لا تحتوي على أي نوع من انواع التأكد اوالـ (error checking)
فهي للتوضيح لا اكثر.
لنبدأ الخطوات:
1) تكوين الملف يكون بهذه السهولة:
fp = fopen(sXmlFile.c_str(),"w"); هذه حتى تفتح ملف جديد و تكتب عليه fp = fopen(sXmlFile.c_str(),"a"); appending هذه حتى تكمل الكتابة على الملف موجود اصلا
فالـ sXmlFile هو اسم الملف المراد تكوينه من نوع string
2) تكوين ما يسمى بالـ tag وهو يكون ال parent, ماهو ال tag؟؟ لنرجع الى المثال اعلاه,
<friend> و <name> و <age> و <living> و <nationality> هذه كلها عباره عن tags
هنا نقوم بأخذ اسم ال tag و نضعه في الsTag و من ثم نخذنه في stack, عملية التخزين بال stack هي لتساعدنا في اغلاق ال ,tag سوف نرى هذا فيما بعد
fprintf(fp,"<%s",sTag.c_str()); fprintf(fp,">"); sTagStack.push(sTag);
3) تكوين ال child, كيفية تكوين <age>21</age>: هي عبارة عن تكوين tag + القيمه التي نريد ان نضعها:
fprintf(fp,"<%s",sTag.c_str()); fprintf(fp,">%s</%s>",sValue.c_str(),sTag.c_str());
كما تلاحظون, لماذا هنا لم نضيف أي قيمة لل stack ؟!
من الواضح اننا هنا نقوم بتكوين الtag و من ثم وضع القمة التي نريدها و من ثم نغلق ال tag
و بهذا لا يكون هناك أي حاجه الى استخدام الstack
4) اغلاق ال parent tag: هنا نقوم باستخدام خاصية ال stack باسترجاع اخر قيمة تم ادخالها الى ال stack و غلاق ال tag
fprintf(fp,"</%s>",sTagStack.top().c_str()); sTagStack.pop();//pop out the last tag
5) اغلاق جميع الparents tags: هذه الخطوه تشبه التي قبلها, ولكن هنا نغلق جميع ال tags المتبقيه بالstack
while(sTagStack.size() != 0)
{
fprintf(fp,"</%s>",sTagStack.top().c_str());
sTagStack.pop();//pop out the last tag
}
هذه هي الاشياء الاساسيه و البسيطه التي تحتاجها لتكوين ملف XML, مازال هناك AddAtributes و AddComment التي إن شاء الله سوف اكمل شرحها + البدء بشرح كيفية قرأت ال XML و استخدام DOM and SAX
إن شاء الله يكون موضوع مفيد و سهل و خفيف و جديد على البعض. اذا كان هناك أي اسئله او استفسارات قبل وضع الدرس الثاني, انا جاهــــــــــــــــــــــــــــــــــــــز.
موفقين...

