بسم الله الرحمن الرحيم
PHP + XML
السلام عليكم ورحمة الله وبركاته والصلاة والسلام على خير خلق الله محمد صلى الله عليه وسلم
أولا هذا الدرس ليس درس XML ولكن هو درس PHP وكيفية دعمه للـ XML
ثانياً لست بصدد شرح أي معلومات عن لغةالـ PHP ولكن شرح تقنية مدعومة أصلاً وكيفية الاستفادة من هذه التقنية
أفترض من القارئ ألمامه بـ HTML و مبادئ XML و مبادئ PHP
للمزيد من المعلومات حول مبادئ الـ XML ننصحك بزيارة :
http://www.w3schools.com/xml
تتكون هذه الدروس من ثلاثة مراحل :
1- بناء مترجم (قارئ) XML في الـ PHP
2- مثال متقدم عن بناء مترجم
3- استخراج معلومات قواعد البيانات في ملفات الـ XML .
الدرس الأول :
بناء مترجم (قارئ) XML في الـ PHP
نظراً لأن كل المراجع هي باللغة الانكليزية واختلاف ترجمة المصطلحات من كاتب لأخر ولتسهيل الرجوع للمصادر سوف اطرح الكلمات الانكليزية وترجمتها المستعملة داخل الدرس
Extensible : قابلة للتوسع أو التمدد
Extensions : تنسيقات
Parser : مترجم - قارئ
Element : عنصر
Handlers : مقابض
Character : محارف
Function : دالة - وظيفة
مقدمة:
(eXtensible Markup Language) XML هذه اللغة التي بدأت بالانتشار في الاونة الأحيرة بشكل واسع وكبير وهي مبنية داخلياً في الـ PHP في نموذج التسيقات.
وعلى عكس الكثير من الامتدادت ,إن XML مدعمة افتراضياً لذلك لا تحتاج إلى إعدادات إضافية لكي تعمل تسطيع أن تتأكد من الدعم أطبع الملف ()phpinfo وقارن كما مع الشكل التالي :

تنسيق الـ XML في الـ PHP يسمح لك بترجمة ملفات الـ XML فتستطيع أن تقرأ من خلال ملفات الـ XML وتتبع العقد والفروع و تنجز العمليات على المعلومات المحتواه داخله
إن الـ PHP لا تستطيع مقارنة و التأكد من صحة وشرعية ملف الـ XML لذلك عليك أن تكون متأكداً من صحة ملف الXML قبل تمريره إلى ملفات الـPHP
بناء مترجم ( قارئ) لـ XML :
قبل أن تبدأ باستعمال صيغة XML الموجودة في الـ PHP لقراءة ملفات الـ XML عليك إعلان بداية مترجم (قارئ) جديد ونظراً لكون هذه اللغة الوصفية قايلة للتوسع والتمدد لذلك فإن لا سبيل للـ PHP لمعرفة العناصر التي تريد أن تبحث عنها داخل ملف الـ XML.
ومن أجل ذلك يجب عليك أن تخبر الـ PHP كيفية قراءة المستند وذلك يكون ابتداءا من تعريف دالة مترجم جديدة ليتم إنشاءه ومن ثم عليك تعريف مقابض العتاصر ومقابض المحارف ولتعريف هذه المصطلحات التي يمكن أن تكون جديدة عليك يكون كالتالي ,
مقابض العناصر : ببساطة هي (FUNCTION) دوال أو وظائف ستستدعى عند مصادفتها هذه العناصر في ملف الـ XML
وهنالك نوعين من المقابض :
الأول : يستدعى عندما يصادف هذا العنصر في ملف الـXML
الثاني : يستدعى عندما يغادر المترجم هذا العنصر
وبالاضافة عليك أن تعرف مقابض للمعلومات المحارف الموجود بين العناصر .
إذا كان قد انتابك شعور بالغموض أو عدم الاستيعاب فدعنا ندعم هذا الشرح بمثال عن ملف XML لمعرفة تكوين هذ الملف أولاً :
كود:
<?xml version="1.0"?>
<document>
<title>XML Is Easy</title>
<body>لمعرفة المزيد أقرأ الدرس كاملاً.</body>
</document>
من الوهلة الأولى يبدو شكل ملف XML مؤلوفاً فهو شبيه إلى حد ما بملفات الـ HTML حيث نلاحظ العناصر محاطة بـ “>” و “<” والبداية والنهاية تفرق بـ “/” ولتبسيط أكثر تستطبع تخيل الوسم
كود:
<H1> عنوان عريض </H1>
ففي البداية العنصر <H1> وفي النهاية </H1> وبينهما هي المعلومات وبعد هذا المثال المبسط إن كنت لازلت تجد غموض في الشرح فهذا يعني أنك لن تستطيع تكملة هذا الدرس لأنه سوف يزداد تعقيداً وسوف ندخل في بنية المترجم (القارئ) .
1- تعريف دالة مترجم جديد :
في بداية كل مترجم عليك تعريف دالة مترجم جديد ليتم إنشاء هذا القارئ أو المترجم وحجزه في الذاكرة وذلك بـ
كود:
$parser = xml_parser_create(ENCODING);
بواسطة هذه الدالة ()xml_parser_create تكون قد أمرت بوجود المترجم والتي هي ضرورية جدا ً لعمل المترجم أو وجوده بالاصل
بالاضافة تستطيع بشكل أختياري وضع نوع الترميز الذي تود ان يتبعه المترجم أوالقارئ وتستطيع أن تختار أحد هذه الانواع الشهيرة :
كود:
· ISO-8859-1 (Default)
· US-ASCII
· UTF-8
الآن بعد أن انتهيت من أول خطوة من إنشاء المترجم سيكون عليك تحضير المقابض التي سوف تمسك العناصر تحضيرا لاستخلاص المعلومات الموجودة بينها.
تعريف مقابض العناصر :
كما تحدثنا سابقاً فإن الخطوة التالية هي تعريف مقابض للعناصر والتي تتم بالدالة ()xml_set_element_handler بالشكل التالي
كود:
xml_set_element_handler(XML_PARSER, START_FUNCTION,END_FUNCTION)
ولهذه الدالة ثلاثة إجراءات :
1- XML_PARSER : وهو المتغير الذي سبق وعرفته في الخطوة الأولى في تعريف مترجم جديد
2- START_FUNCTION : وهي الدالة التي سيتم استدعائها عند بداية مصادفة المترجم للعنصر
3- END_FUNCTION : وهي الدالة التي سيتم استدعائها عند مغادرة المترجم لهذا العنصر
تعريف مقابض المحارف :
تعرف بالدالة ()set_character_handler بالشكل التالي :
كود:
xml_set_character_handler(XML_PARSER, CHARACTER_FUNCTION);
وتأخذ الاجراءات التالية :
1- XML_PARSER : وهو المتغير الذي سبق وعرفته في الخطوة الأولى في تعريف مترجم جديد
2- CHARACTER_FUNCTION : وهي الدالة التي سيتم استدعائها في حالة مصادفة المترجم معلومات المحارف
الشروع في المترجم :
الجزء الأخير من هذه الاحجية هو إعطاء الأمر في بداية كل العمليات السابقة وذلك بالدالة xml_parse(): بالشكل التالي :
كود:
xml_parse(XML_PARSER, XML);
وتأخذ الاجراءين التاليين :
1- XML_PARSER : وهو المتغير الذي سبق وعرفته في الخطوة الأولى في تعريف مترجم جديد
2- XML : ملف الـ XML الذي سوف يتم قراءته
تنظيف (تفريغ الذاكرة ) :
بعد الانتهاء من قراءة المستند يتوجب عليك الآن إفراغ الذاكرة التي تم حجزها من خلال تكوينك المترجم وتكون بالدالة ()xml_parser_free على الشكل التالي :
كود:
xml_parser_free(XML_PARSER);
ويأخذ إجراء واحد هو XML_PARSER : وهو المتغير الذي سبق وعرفته في الخطوة الأولى في تعريف مترجم جديد.
والآن بعد كل هذا الشرح للننتقل إلى الجزء العملي في الدرس وهو مثال عملي عن كل ما طرح في الأعلى
عليك أولا إنشاء ملفين الأول باسم simple.xml و الثاني xml1.php وأيضا محرر للنصوص للتمكن من كتابة الكود في داخلهما والـ notepad تفي بالغرض
سنستخدم طريقة ترقيم الكود لكي يسهل شرح كل سطر على حدا
simple.xml
كود:
1. <?xml version="1.0"?>
2. <document>
3. <title> معرضXML</title>
4. <body>لاستكشاف هذه اللغة عليك قراءة الموضوع</body>
5. </document>
xml1.php
كود:
<html dir=rtl>
1. <?
2. function startElement($xml_parser, $name, $attributes) {
3. print("<p><i>هنا تم مصادفة العنصر :</i>$name\n");
4. }
5.
6. function endElement($xml_parser, $name) {
7. print("<p><i>هنا مغادرة العنصر:</i>$name\n");
8. }
9.
10. function characterData($xml_parser, $data) {
11. if($data != "\n") {
12. print("<p><i>هنا مصادفة المعلومات:</i>$data\n");
13. }
14. }
15.
16. function load_data($file) {
17. $fh = fopen($file, "r") or die ("<P>لم يستطع فتح الملف!");
18. $data = fread($fh, filesize($file));
19. return $data;
20. }
21. /***** الرئيسي *****/
22. $file = "simple.xml";
23. $xml_parser = xml_parser_create();
24. xml_set_element_handler($xml_parser, "startElement", "endElement");
25. xml_set_character_data_handler($xml_parser, "characterData");
26. xml_parse($xml_parser, load_data($file)) or die ("<P> خطأ في قراءة الملف XML!");
27. xml_parser_free($xml_parser);
28. ?>
29. </html>
النتيجة ستكون كالتالي :

وشرح هذا السكريبت سطراً سطراً يكون :
2- في البداية أنشأنا دالة اسمها startElement() لتمسك أي عنصر يصادفه السكريبت في قراءة ملف الـ XML وتأخذ هذه الدالة الاجراءين التاليين
· $xml_parser
· $name
· $attributes
3 – طباعة عبارة " هنا تم مصادفة العنصر ".
6 – إنشاء دالة اسمها endElement() لتسمك نهاية أي عنصر يصادفه السكريبت اثناء قراءته لملف الـ XML وتأخذ الاجراءات التالية :
· $xml_parser
· $name
7- طباعة عبارة " هنا مغادرة العنصر ".
10– إنشاء دالة اسمها characterData() لتسمك المعلومات التي تحدها بين بداية ونهاية العنصر والذي يصافده السكريبت اثناء قراءته لملف الـ XML وتأخذ الاجراءات التالية
· $xml_parser
· $data
11- التأكد من أن المعلومات بين العنصر ليست سطر فارغ عن طريق if($data != "\n")
12- طباعة عبارة " هنا مصادفة المعلومات ".
16- إنشاء دالة اسمها load_data() والتي سوف تقرأ المعلومات من الملف إلى السكريبت والذي بدوره سوف يترجمه وتأخذ إجراء واحد هو $file هو اسم الملف كاملا متضمناً المسار الكامل لملف الـ XML الذي سوف يتم ترجمته
17- محاولة العثور على مقبض الملف $file في حالة الفشل سوف يتك إيقاف السكريبت وطباعة رسالة الخطأ
18- في حالة النجاح قراءة الملف ووضعه داخل متغير هو $data
* ملاحظة هذه الاجراء لا ينفع مع الملفات الضخمة
19- إعادة المتغير $data إلى البرنامج
22 - تعريف الملف الذي سوف تتم قرائته مع ملاحظة أنه يمكن أن يكون مع المسار الكامل
· Windows: $file = "C:\appserv\www\xml\myxmlfile.xml";
· Linux: $file = "/home/me/xml/myxmlfile.xml";
23- إنشاء متغير $xml_parser الذي سوف يعرف المترجم للـ PHP بواسطة الدالة xml_parser_create()
24- تحديد مقابض بداية ونهاية العنصر التي حددتها في الأعلى وذلك باستخدام دالة xml_set_element_handler() وتعني في أي مكان يجد عنصر عليه أن يتعامل معه بالدالة السابقة
25- تحديد مقبض المحارف بواسطة الدالة xml_set_character_data_handler() وتعني في أي مكان تجد فيه معلومات عليك التعامل معها بواسطة الدالة characterData()
26- بداية قراءة الملف بواسطة الدالة xml_parse() والتي تحتاج للمتغير $xml_parser وإلى مصدر المعلومات وفي مثالنا استخدمنا الدالة load_data($file) وفي حالة الفشل سوف يوقف عمل السكريبت ويطبع رسال خطأ
27- بعد انتهاء المترجم من عمله علينا إفراغ الذاكرة من المتغيرات المحجوزة عن طريق الدالة
()xml_parser_free
وبذلك نكون انتهينا من شرح المثال بالكامل. والحمد لله رب العالمين
ملفات هذا الدرس تستطيع أن تحصل عليها من الرابط
http://www.e3lannat.com/XML/lesson1_...lanNat.CoM.rar