المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : التعامل مع ملف xml خارجي باستخدام الأكشن سكريبت 3


خادم المسلمين
30-05-2014, 01:52 PM
بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته




في السابق تحدثنا عن كيفية إنشاء ملف XML باستخدام الأكشن سكريبت 3. في الحقيقة هو ليس ملف XML فعلي ولكن تركيبة ملف XML ولكن العمل معها بهذه الطريقة لا يعفينا من تعديل ملف الفلاش الأصلي وإنتاجه ثم رفعه من جديد على الانترنت بل أننا لم نستفد كذلك من قوة ملفات XML الخارجية وهذا ما سنفعله الآن بالتحديد.
في البداية يجب أن يكون لدينا ملف XML موجود بنفس مكان حفظ ملف الفلاش وهو هنا ملف class.xml ويحتوي على البيانات التالية:
<?xml version="1.0" encoding="UTF-8"?>
<grade>
<student>
<st_id>297020280492</st_id>
<st_name>عبدالله محمد عبدالله العنزي</st_name>
<quran>11</quran>
<islamic>24</islamic>
<arabic>36</arabic>
<english>31.5</english>
</student>
<student>
<st_id>296087601625</st_id>
<st_name>منصور ناصر محمد الخالدي</st_name>
<quran>3</quran>
<islamic>22</islamic>
<arabic>36</arabic>
<english>26</english>
</student>
<student>
<st_id>296032401125</st_id>
<st_name>ناصر فايز عبدالحميد العتيبي</st_name>
<quran>13</quran>
<islamic>24.5</islamic>
<arabic>35</arabic>
<english>35</english>
</student>
</grade>
هذه عبارة عن قاعدة بيانات تحتوي على درجات ثلاث طلاب لكل طالب هناك رقم مدني واسمه بالإضافة لدرجته في بعض المواد. سوف نقوم باستيراد هذه البيانات للفلاش عن طريق الأكشن سكريبت وذلك من خلال إنشاء متغير باسم sGrade نوعه XML دون إسناء أي قيمة له كما يلي:
var sGrade:XML;
سوف نقوم بإسناد القيمة في وقت لاحق عندما نقوم بتحميل البيانات من ملف XML. الآن سوف نقوم بتحديد مكان ملف XML وذلك عن طريق تعريف متغير xmlReq نوعه URLRequest ثم يساوي نكتب الأمر new ثم نوع الكائن هو URLRequest وبين القوسين نكتب مسار ملف XML بين علامتي تنصيص إذا كان الملف بنفس مكان حفظ ملف الفلاش نكتب فقط اسم ملف XML ليكون الأمر في النهاية بالشكل التالي:
var xmlReq:URLRequest = new URLRequest("class.xml");
ما قمنا به حتى الآن هو إنشاء متغير نوعيه XML حتى يتيح لنا التحكم بالبيانات الموجودة بداخل ملف XML ولكن قبل ذلك يجب أن نحدد مكان حفظ ملف XML وهذا ما قمنا به عن طريق تعريف متغير من نوع URLRequest. والآن يجب أن نقوم بتحميل البيانات إلى ملف الفلاش وذلك بتعريف متغير باسم xmlLoader نوعه URLLoader ثم يساوي ونكتب الأمر new ثم اسم الكائن وهو URLLoader ليكون الأمر في النهاية بهذا الشكل:
var xmlLoader:URLLoader = new URLLoader();
ما قمنا به هو إنشاء المتغير التي سوف يتولى عمليه تحميل بيانات ملف XML يجب أن نقوم بتحميل البيانات بداخل هذا المتغير وذلك عن طريق استخدام الخاصية load ثم نكتب بين القوسين موقع ملف XML والذي تم تخزينه في المتغير xmlReq لذلك سوف نكتب اسم المتغير فقط ليكون الأمر في النهاية بهذا الشكل:
xmlLoader.load(xmlReq);
بعد أن قمنا بتحميل بيانات ملف XML في المتغير xmlReq يجب أننصت لهذا المتغير ففي حاله تحميل البيانات كاملة في المتغير نقوم بإضافة البيانات إلى الكائن XML وهو sGrade لكي نتحكم بهذه البيانات. لذلك نحن بحاجة لإنشاء حدث للكائن xmlLoader وهو Event.COMPLETE وهو يرى أهل أنتهى تحميل البيانات في المتغير exlLoader أم لا فإذا أنتهى تحميل البيانات فإنه سوف ينادي على داله معينه. لن أقوم بشرح طريقة عمل الاحداث لأنه سبق وقمنا بشرحها لذلك سوف أتحدث عن الأهم وهو ما سوف يحدث بداخل الداله وليكن اسم الداله هو xmlLoaded. ما نريد هو أن يتم تحميل بيانات ملف XML بداخل المتغير sGrade حتى يمكننا التحكم بها ويمكن القيام بذلك عن طريق كتابة اسم المتغير sGrade ثم يساوي ونكتب الأمر new ثم نوع الكائن وهو XML وبداخل القوسين نكتب اسم المتغير التي يتولى عمليه تحميل البيانات وهو xmlLoader ثم نقطة ونكتب الأمر التي سوف يقوم بإسناد بيانات ملف XML إلى المتغير sGrade وهو ببساطه الأمر data ليكون الأمر في النهاية بهذا الشكل:
xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
function xmlLoaded(e:Event):void
{
sGrade = new XML(xmlLoader.data);
}
حتى الآن قمنا بتحميل البيانات في المتغير sGrade فقط حتى يتسنى لنا التحكم بها وذلك إما عن طريق عرضها في مربع النص أو في نافذة المخرجات Output كما شرحنا في السابق. لنفرض أننا نريد عرض البيانات في مربع نص يحمل الاسم info_txt كل ما علينا فعله هو بداخل الدالة xmlLoaded نكتب اسم مربع النص وهو info_txt ثم نقطة ونكتب الخاصية التي تتيح لنا إضافة نص إلى مربع النص وهي text ثم يساوي ونكتب اسم المتغير الذي يحمل البيانات وهو sGrade ثم نكتب نقطة ونكتب الخاصية التي تقوم بتحويل البيانات إلى نص وهي toXMLString ليكون الأمر في النهاية بهذا الشكل:
function xmlLoaded(e:Event):void
{
sGrade = new XML(xmlLoader.data);
info_txt.text = sGrade.toXMLString();
}
في الحقيقة أنك لست بحاجة إلى استخدام الخاصية toXMLString إذ يمكنك استخدام اسم المتغير الذي يحمل البيانات فقط وهو sGrade. بعد تحميل البيانات يجب أن نقوم الآن بعرض هذه البيانات. كما لاحظنا أن ملف XML يحتوي على عنصر أساسي وهو grade وعدد من العناصر الفرعية تحميل نفس الاسم وهو student تكرار هذه العناصر يمثل شيء اسمه XMLList بحيث أن هذه العناصر الفرعية فعلياً تمثل مصفوفة Array. في السابق عندما نريد عرض عنصر معين في مربع النص المسمى info_txt يمكن كتابة اسم المتغير الذي يحمل البيانات وهو sGrade ثم نقطه ونكتب اسم العنصر الذي نريد عرضة وليكن العنصر الأول وهو student ليكون الأمر في النهاية بهذا الشكل:
info_txt.text = sGrade.student;
عند عرض هذه البيانات في مربع النص أو حتى نافذة المخرجات باستخدام الأمر trace فإنك سوف تلاحظ أنه تم عرض جميع العناصر الفرعية التي تحمل الاسم student وليس العنصر الفرعي الأول لنفس الاسم. هذا بالضبط ما يجب أن يحدث لذلك نعود لما ذكرناه سابقاً أولا وهو XMLList فكل عنصر من هذه العناصر والتي لها نفس الاسم سوف تمثل عنصر في مصفوفة بحيث إذا كان مجموعه التي باسم student ثلاثة فإنها تكون ثلاث عناصر لمصفوفة اسمها student وبالتالي عندما نريد الوصول للعنصر الأول بإمكاننا كتابة اسم العنصر وهو student وبعد ذلك نكتب فهرس العنصر بين قوسين وبما أننا نريد العنصر الأول فإنه بهذه الحالة يحمل الفهرس رقم صفر بما أن المصفوفة تبدأ الفهرسة من الصفر وليس الواحد ليكون الأمر بالنهاية بهذا الشكل:
info_txt.text = sGrade.student[0];
وعند اختبار للعمل سوف تلاحظ أنه تم عرض العنصر الأول فقط. وبالمثل بإمكانك عرض باقي العناصر ولكن لنفترض أن لديك الكثير من العناصر وتريد عرض العنصر الأخير فقط يمكن القيام بذلك عن طريق استخدام الخاصية length وهي تعرض لك عدد العناصر في XMLList وهي هنا ثلاث عناصر ولكن تذكر أن فهرسة المصفوفة تبدأ بصفر إذاً من المفترض أن يكون فهرس آخر عنصر هو اثنان وليس ثلاثة ذلك يجب حذف واحد من العدد الإجمالي للعناصر. وفيما يلي توضيح لطريقة كتابة الأمر لعرض عدد العناصر في المصفوفة بالإضافة لعرض العنصر الأخير كما يلي:
info_txt.text = sGrade.student.length(); // عرض عدد العناصر
info_txt.text = sGrade.student[sGrade.student.length() - 1]; // عرض العنصر الأخير
هناك طريقة أخرى للوصول إلى جميع عناصر student أو عنصر محدد وهو باستخدام علامه النجمة * مثلا إذا كنا نريد جميع العناصر الموجودة في العنصر sGrade بإمكاننا كتابة اسم العنصر ثم نقطة ونضع علامة النجمة وبذلك سوف يعرض العناصر الموجودة بداخل sGrade وهي هنا فقط عناصر student ولكن إذا كنا نريد العنصر الأول فقط من عناصر sGrade بإمكاننا استخدام الفهرسة لعمل ذلك. أيضاً يمكننا عرض عدد عناصر في المصفوفة وعرض العنصر الأخير باستخدام نفس الطريقة وهي النجمة ويمكن كتابة الأوامر بالشكل التالي:
trace(sGrade.*); // sGrade عرض جميع العناصر بداخل
trace(sGrade.*[0]); // sGrade عرض العنصر الأخير بداخل
trace(sGrade.*.length()); // sGrade عرض عدد العناصر بداخل
trace(sGrade.*[sGrade.*.length() - 1]); // sGrade عرض العنصر الأخير بداخل
حسناً لنتحدث قليلاً عن البحث في ملفات XML في الحقيقة هذا سهل جداً لنفترض أننا نريد البحث عن الطالب الذي يحمل الرقم المدني 296087601625 كل ما علينا فعله هو كتابة اسم المتغير الذي يحمل بيانات XML وهو sGrade وبغض النظر عما كنت عرف اسم العنصر الفرعي أو لا بإمكانك استخدام علامه النجمة إذا سوف نضع نقطة ونضع علامة النجمة ثم نقطة وبداخل القوسين نكتب ما نريد البحث عنه بما أننا نريد البحث عن الطالب الذي يحمل الرقم المدني 296087601625 إذا نكتب اسم حقل الرقم المدني وهو st_id ثم نضع علامتي يساوي والغرض منها التحقق من تساوي قيمتين ثم بعد ذلك نضع الرقم المدني بين علامتي تنصيص ليكون الأمر في النهاية بهذا الشكل:
trace(sGrade.*.(st_id == "296087601625"));
وعند اختبار العمل سوف تلاحظ عرض العنصر الذي يحتوي على الرقم المدني 296087601625. لنفترض أننا نريد عرض جميع أسماء الطلاب الموجودة في ملف XML يمكننا عمل ذلك باستخدام for each وذلك عن طريق كتابة الأمر for each وبين القوسين نقوم بتعريف متغير باسم names ونوعه XML لأنه سوف تخزن به بيانات من نفس النوع ثم نكتب الأمر in ونضع المتغير الذي يحمل بيانات ملف XML وهو sGrade ثم نقطة ونضع علامة النجمة لأننا نريد أن نبحث عن اسم الطالب في جميع العناصر الفرعية سواء كان اسمها student أو غير ذلك. وفي داخل القوس المموج سوف نقوم بعرض البيانات في نافذة المخرجات بواسطة الأمر trace بما أننا نريد عرض اسم الطالب وهذا الحقل باسم st_name إذا سوف نكتب اسم المتغير names والذي سوف تخزن به البيانات كل عملية بحث ثم نقطة ونكتب اسم الحقل وهو st_name ليكون الأمر في النهاية بهذا الشكل:
for each(var names:XML in sGrade.*)
{
trace(names.st_name);
}
وعند اختبارك للعمل سوف تلاحظ عرض جميع أسماء الطلاب.

فرح صالحي
30-05-2014, 03:29 PM
http://im53.gulfup.com/ZkUhRt.gifhttp://im53.gulfup.com/ZkUhRt.gif

الحارث بن فيصل
30-05-2014, 06:01 PM
خالص الشكر والامتنان على ما بذلتموه من جهود مباركة في إعداد هذا العمل


وفقكم الله وأثابكم ونفع بكم

أبو يوسف
31-05-2014, 02:58 PM
جزاكم الله خيرا أخانا خادم المسلمين

موفق بإذن الله ... لك مني أجمل تحية .

أبو صخر
31-05-2014, 08:21 PM
شـكــ وبارك الله فيك ـــرا لك ... لك مني أجمل تحية .

abohmam
31-05-2014, 11:38 PM
جزاك الله خيرا أخى خادم المسلمين

بارك الله في جهودك

أبو فارس
06-06-2014, 11:08 AM
موفق بإذن الله ... لك مني أجمل تحية .