>> الصفحة الرئيسية >> سلسلة دروس للمبتدئين >> مدخل الى xml في Qt

الأقسام الرئيسية

 التنصيب والاعداد التنصيب والاعداد
 دروس متقدمة دروس متقدمة
 سلسلة دروس للمبتدئين سلسلة دروس للمبتدئين
 اساسيات لغة سي++ اساسيات لغة سي++
 مقالات ZetCode مقالات ZetCode
 

جديد الدروس

 الوحدة QtUiTools (واجهة المستخدم ديناميكية التوليد)
التاريخ 04/07/2009 الوحدة QtUiTools (واجهة المستخدم ديناميكية التوليد)
 Qt and Phonon
التاريخ 04/07/2009 Qt and Phonon
 تتمة الرسائل ومربعات الحوار في qt
التاريخ 04/07/2009 تتمة الرسائل ومربعات الحوار في qt
 مدخل الى xml في Qt
التاريخ 04/07/2009 مدخل الى xml في Qt
 الإدخال والإخراج لبيانات الفئات
التاريخ 04/07/2009 الإدخال والإخراج لبيانات الفئات
 

مدخل الى xml في Qt

بسم الله الرحمن الرحيم
السلام عليكم و رحمة الله و بركاته
سنستعرض اليوم بعض التعريفات والمفاهيم حول xml
كما نلفت انتباه الاخوة ان هذا الدرس انما هو مدخل لمعرفة الاكس ام ال عند المبتدئين وليس درس متقدم في الاكس ام ال فلذا نرجو من عنده اطلاع في هذا الموضوع ان يثريه بما لديه وجزاه الله خيرا
ولذلك سوف نقسم درسنا الى اقسام اساسية وهي :
1- نبذة سريعة عن xml
2- بعض المافاهيم الضرورية
3- كيفية فتح ملف xml في QT
4- قراءة بيانات الملف المفتوح
5-الكتابة في ملف xml
6-حفظ البيانات الى ملف

1- نبذة سريعة عن الاكس ام ال Xml
ملفات xml من اكثر الملفات استعمالا اذ لايخلو برنامج او موقع منها لسرعتها وخفتها فهي عبارة عن ملفات تخزن فيها البيانات بطريقة سهلة ومنطقية تاخذ شكل شجرة متفرعة مثل شجرة العائلة او شكل هرمي كما يحلو للبعض تسميتها وان كنت احبذ الوصف الاول اي البناء الشجري فاذا كنت تريد ان تخزن بيانات لا تحتاج الى حماية او كلمة سر وما الى ذلك فلا داعي لاستعمال قواعد البيانات وبناء الدرايفر ...ووو بل ماعليك الا استعمال ملفات xml
كما ان هذه الملفات قابلة للقراءة في كل انظمة التشغيل سواء ويندو او لينوكس او ماك دون الحاجة لبناء درايفر
تقريبا كل لغات البرمجة تمتلك ادوات للتعامل مع ملفات xml
اما فيما يخص QT فقد وفرت مكتبة ضخمة وادوات مساعدة للتعامل مع هذه الملفات


2- بعض المفاهيم الضرورية
حتى لانطيل على الاخوة في التعريفات بل نبسط ما امكن
سنقوم بانشاء ملف xml قم بفتح اي محرر نصوص ثم قم بتعريف الملف بالطريقة التالية

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  

ثم تخيل معي اننا سندخل بيانات عائلة كبيرة تتكون من اباء وابناء واحفاد
ولكل شخص من هؤلاء اسم وعمر وصفات اخرى
ولذلك يجب ان تعرف ان ملفات xml تتكون من الجذر root ومن عناصر element وكل عنصر يمكن ان يحوي عناصر اخرى ابناء child
كما ان كل عنصر يتكون من وسم tag
ويمكن ان يحوي صفات كثيرة attributes ونص text
فلهذا سنعطي للجذر وسم tag نسميه مثلا root
و نعطي للاباء وسم tag وليكن مثلا per
ثم نعطي للابناء وسم tag وليكن child
وكذلك نعطي للاحفاد وسم tag وليكن child2
ثم نظيف لكل واحد صفة العمر attribute ولتكن مثلا age
وصفة للترميز ولتكن id
وصفة الاسم ولتكن name
ولذلك سيكون ملفنا كالآتي
  1.  
  2. <root>
  3. <per id="1" age="60" name="عبد الله" >
  4. <child id="1" age="35" name="سعيد">
  5. <child2 id="1" age="10" name="محمد" />
  6. <child2 id="2" age="5" name="احمد" />
  7. </child>
  8. <child id="2" age="33" name="اسعد">
  9. <child2 id="1" age="10" name="حسن" />
  10. <child2 id="2" age="5" name="حسين" />
  11. </child>
  12. </per>
  13. <per id="2" age="50" name="عبد الرحمن" >
  14. <child id="1" age="30" name="عمر">
  15. <child2 id="1" age="6" name="المثنى" />
  16. <child2 id="2" age="2" name="بدر" />
  17. </child>
  18. </per>
  19. </root>
  20.  
  21.  


لاحظ جيدا ان العنصر الذي لا يحتوي ابناء فإنه ينتهي ب />
اما الذي يحوي ابناء فإنه ينتهي ب <tagname/> بحيث tagname هو اسم الوسم
كما يمكن ان نظيف للعنصر الذي لا يحتوي ابناءا نصا مثلا

  1.  
  2. <child2 id="2" age="15" name="حسين" />This is examples in Qt</child2>
  3.  
  4.  

كما يمكن ان تتخيل عدة بناءات اخرى لملفات xml حسب ما تمليه الحاجة ليس هذا موضع بسطها
وانما اردنا ان نبين بعض المفاهيم الضرورية لكي نتعامل مع هذه الملفات ولتبسيط الرؤية فقط
3- كيفية فتح ملف xml في QT

لفتح ملفات Xml في qt نستعمل الطريقة العادية لفتح الملفات

  1.  
  2. QFile file("xmlfile.xml");
  3. file.open(QIODevice::ReadOnly);
  4.  

لكن ما يهمنا هو المحتوى الذي سنتعامل معه ولهذا يجب علينا القيام بعدة تعريفات ضرورية
فهناك عدة طرق في كويتي للتعامل مع ملفات اكس اما بالاعتماد على SAX او DOM
اما نحن فنستعمل طريقة DOM في هذا المثال
اولا يجب نعلم البرنامج اننا سنستعمل ملفات xml وذلك بتحرير ملف pro للبرنامج ونضيف له مايلي
  1.  
  2. QT += xml
  3.  

ثم في الملف الرأسي نعرف طريقة التعامل مع ملفات xml
  1.  
  2. #include <QdomDocument>
  3.  

كما نقوم بتعريف الوثيقة التي ستحوي ملف xml
  1.  
  2.  

ثم نقوم بفتح الملف وتحميله في وثيقة doc
  1.  
  2. QFile file("xmlfile.xml");
  3. file.open(QIODevice::ReadOnly);
  4. if (!doc.setContent(&file))
  5. {
  6. QMessageBox::Critical(this, "error", "error");
  7. return;
  8. }
  9. file.close();
  10.  
  11.  


قمنا بفتح ملف "xmlfile.xml" لوضع القراءة فقط ReadOnly ثم حملنا المحتوى في doc باستعمال الدالة setContent وللتأكد من ان المحتوى سليم استعملنا عبارة if اي اذا كان محتوى الوثيقة هو الموجود في ملف file فسوف يتابع البرنامج اما اذا وجد خطأ في المحتوى فسيعطينا رسالة خطأ ثم يخرج باستعمال return
ثم اغلقنا ملف file لاننا لم نعد بحاجة اليه

4- قراءة بيانات الملف المفتوح
بعد ان فتحنا الملف لم يبقى لنا الا قراءة محتوياته وذلك ما سنتطرق اليه ان شاء الله
باستعمال الدوال
QdomNodeList و QdomElement و QdomNode
والسلام عليكم



الجزء الثاني



السلام عليكم ورخمة الله
قبل البدأ في قراءة البيانات هناك تعريفات ومفاهيم لابد منها
كنا قد بينا من قبل ان ملفات xml تحتوي على عناصر وكل عنصر يمكن ان يحتوي على عناصر اخرى
في لغة xml هذه العناصر تسمى فروع node بغض النظر على مايمكن ان تحتويه من صفات ونصوص ولذالك عند التنقل بين هذه الفروع نستعمل node مثل node. NextSibling للانتقال الى الفرع التالي ….الخ
اما لقراءة بينات كل فرع يجب تحويله الى عنصر element باستعمال الدالة node.toElement()
واول مايجب علينا قراءته في الوثيقة doc هو الجذر root
  1.  
  2. QDomElement root = doc.documentElement();
  3.  
  4.  

ثم نعطي مؤشرا لاول فرع في الجذر ان كان موجودا اي الابن الاول في الجذر
  1.  
  2. QDomNode noeud = root.firstChild();
  3.  

سنحصل على اول فرع من الجذر والذي هو في مثالنا السابق "عبد الله” والذي يحمل وسم per
وللانتقال الى الابن التالي للجذر نستعمل
  1.  
  2. noeud = noeud.nextSibling
  3.  

وهكذا الى اخر فرع
ولنحاول الان قراءة بيانات اول فرع عندنا
  1.  
  2. myper=noeud.toElement();
  3.  
  4.  

لاحظ جيدا اننا للتنقل بين الفروع node استعملنا الدالة QdomNode ثم لقراءة بينات الفرع استعملنا الدالة QdomElement ثم نبدأ في القراءة باستعمال الدالة Qstring لاسترجاع صفات العنصر attribute
  1.  
  2. QString id= myper.attribute("id");
  3. QString name=myper .attribute("name");
  4. QString age=myper .attribute("age");
  5.  
  6.  

اظن ان الامر بسيط جدا لحد الان لكن لنفترض ان العنصر يحتوي نصا فهنا يجب ان تعلم ان النص هنا يعتبر فرعا بحد ذاته ولذلك لا نستعمل QdomElement بل نستعمل QdomNode ونقوم بعملية تحويل لهذا الفرع الى نص
  1.  
  2. QString text=noeud.firstChild().toText().data();
  3.  
  4.  

والان ماذا لو اردنا ان نعرف عدد الابناء في الفرع الذي اشرنا اليه ففي هذه الحالة نستعمل الدالة QdomNodeList
مثلا :
  1.  
  2. tab = myper.childNodes();
  3. int count=tab.length();
  4.  
  5.  
  6.  



والان للتوضيح اكثر سنقوم بمثال عملي وافضل مثال لذلك هو ملأ أدات الشجرة treeWidget لمشابهتها في التكوين لملفات xml
  1.  
  2.  
  3. QFile file("xmlfile.xml");
  4. file.open(QIODevice::ReadOnly);
  5. if (!doc.setContent(&file))
  6. {
  7. return;
  8. }
  9. file.close();
  10. //التعريفات لعناصر الشجرة
  11. QTreeWidgetItem *item_per;
  12. QTreeWidgetItem *item_child ;
  13. QTreeWidgetItem *item_child2 ;
  14. //استرجاع العنصر الجذر
  15. QDomElement root = doc.documentElement();
  16. //اول فرع للجذر
  17. QDomNode noeud = root.firstChild();
  18. //الدخول في حلقة مادامت الفروع موجودة
  19. while(!noeud.isNull())
  20. {
  21. //تعريفات القوائم
  22. //العناصر الاباء
  23. QDomElement myper;
  24. //تحويل فرع الاب الى عنصر
  25. myper=noeud.toElement();
  26. //استرجاع اسم الاب
  27. QString textper=myper.attribute("name");
  28. // treeWidgetالكتابة في
  29. item_per= new QTreeWidgetItem(treeWidget);
  30. item_per->setText(0,textper );
  31. //قائمة ابناء الاب المشار اليه
  32. tab = myper.childNodes();
  33. //الدخول في حلقة الابناء
  34. for(int i=0;i<tab.length();++i){
  35. //الفرع المشار اليه بواسطة العدد المحصل عليه في كل دورة من الحلقة
  36. QDomNode noeud2=tab.item(i);
  37. QDomElement mychild=noeud2.toElement();
  38. QString textchild= mychild.attribute("name");
  39. item_child= new QTreeWidgetItem(item_per);
  40. item_child->setText(0,textchild );
  41. tab2 = mychild.childNodes();
  42. //الدخول في حلقة الاحفاد
  43. for(int r=0;r<tab2.length();r++)
  44. {
  45. QDomNode noeud3=tab2.item(r);
  46. QDomElement mychild2=noeud3.toElement();
  47. QString textchild2= mychild2.attribute("name");
  48. item_child2= new QTreeWidgetItem(item_child);
  49. item_child2->setText(0,textchild2 );
  50. }
  51. }
  52. //الانتقال الى الاب الثالي
  53. noeud = noeud.nextSibling();
  54. }
  55. //تفريغ محتويات الذاكرة
  56. doc.clear();


هذا مثال بسيط لقراءة هذه الملفات فما عليك الان الا تخيل ما تريد ان تفعله كما يمكنك ان تبسط المثال اكثر حسب ما يمليه عليك البرنامج الذي انت بصدد كتابته كأن تستعمل ادات النص والتنقل بين العناصر عنصرا عنصرا …. الى غير ذالك
كما يمكنك التنقل عبر وسم خاص tag خاصة اذا كان عندك ملف يختلف الوسم فيه من عنصر لاخر في العمود الواحد وذلك باستعمال الخاصية tagName() فمثلا
  1.  
  2.  
  3. if (per.tagName()== "example"){
  4. //الكود الخاص بالاستثناء المشار اليه
  5. }
  6.  

والان حاول ان تدخل تعديلات على ملف xml بحيث تغير في الوسم وتظيف الكود المشار اليه انفا لتحصل على النتائج المرجوة
في المرة القادمة ان شاء الله سنبين كيفية الكتابة في ملف xml وكيفية تعديل البيانات
والسلام عليكم



الجزء الثالث



5-الكتابة في ملف xml
بعد ان تعرفنا على كيفية قراءة بيانات من ملف xml فلنحاول الان الكتابة في الملف
1 تغيير بيانات عنصر
لتغيير بيانات عنصر ما ما عليك الا ان تحدد المؤشر الى ذلك العنصر ثم تستعمل الدلة اللازمة فمثلا اذا كنت تريد تغيير قيمة الصفة attribute تستعمل الدالة setAttribute
مثلا نريد ان نغير صفة الحفيد بدر بعد ان نؤشر عليه وهي صفة العمر فنكتب :
  1.  
  2. if (mychild2.attribute("name")=="بدر" ){
  3. mychild2.setAttribute("age","5");
  4. }
  5.  
  6.  
  7.  

هنا قمنا بتغيير سن بدر من 2 الى 5 سنوات ثم قس على هذا المنوال بحيث يمكنك تغيير كل ما ترييد حتى الوسم وذلك باستعمال setTagName......الخ

2 اظافة عنصر جديد
لانشاء عنصر جديد نستعمل الدالة createElement
ولادراجها نستعمل الدالة appendChild او insertAfter او insertBefore حسب ما تمليه عليك الحاجة
appendChild : يضيف عنصرا جديدا الى الاب المحدد
insertAfter : يضيف عنصرا جديدا بعد العنصر المحدد
insertBefore : يضيف عنصرا جديدا قبل العنصر المحدد
مثلا نريد ان نضيف ابنا ولد حديثا لعمر :
  1.  
  2. if (mychild .attribute("name")==”عمر”)
  3. {
  4. //انشاء عنصر جديدونضيف له وسم الاحفاد
  5. QDomElement newchild=doc.createElement("child2");
  6. //اظافته الى ابناء عمر
  7. mychild.appendChild(newchild);
  8. //صفة الترميز
  9. newchild.setAttribute("id",3);
  10. //صفة الاسم
  11. newchild.setAttribute("name",”عثمان”);
  12. //صفة العمر
  13. newchild.setAttribute("age",0);
  14.  
  15. }
  16.  
  17.  
  18.  

3 حذف عنصر
لحذف عنصر ما يمكنك ان تتبع الاجراء السابق وتؤشر على العنصر المراد حذفه ثم تستعمل الدالة removeChild فمثلا نريد ان نشير الى عنصر باي دلالة كانت سواء بدلالة الصفة او الوسم ثم نقوم بحذفه فمثلا نريد حذف الحفيد عثمان بدلالة صفة الاسم او الترميز او العمر او بهم جميعا
فمثلا

  1.  
  2. if (mychild2 .attribute("name")==”عثمان” && mychild2 .attribute("id")==0)
  3. {
  4. //بعد توفر الشرط يقوم الاب بحذف ابنه
  5. mychild.removeChild(mychild2);
  6.  
  7.  
  8. }
  9.  
  10.  


اظن ان العملية بسيطة جدا لا تحتاج الى شرح اكبر ولذلك يمكن ان ننتقل الى الدرس الاخير وهو


6-حفظ البيانات الى ملف
بعد ان قمت بتغيير البيانات في الوثيقة doc يمكنك حفظ البيانات الجديدة وذلك بكل بساطة
  1.  
  2. //فتح الملف للكتابة عليه
  3. QFile file("xmlfile.xml");
  4. file.open(QIODevice::WriteOnly);
  5. //الكتابة في الملف
  6. QTextStream out(&file);
  7. const int IndentSize = 1;
  8. doc.save(out,IndentSize); //حفظ الملف
  9. file.close();
  10. doc.clear();
  11.  
  12.  

يمكنك الاستفسار عن كل هذه المخرجات في وثاءق qt فلا حاجة بنا للاطالة الان
ارجو ان اكون قد وفقت في ايصال ولو فكرة بسيطة عن ملفات xml باستعمال QdomDocument كما يمكن للاخوة ان يسترسلوا في البحث عن اشياء اخرى في وثاءق qt فهي كثيرة جدا ولا يمكن الاحاطة بها كلها

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

إسم الكاتب تاريخ الإضافة التقييم / المقيمين زيارات الدرس
أبو زكريا 04/07/2009 8 / 1 476

الأكثر زيارة

 دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير QDevelop
الزيارات 2319 دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير QDevelop
 اعداد وتنصيب Qt
الزيارات 2161 اعداد وتنصيب Qt
 دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير Eclipse
الزيارات 2128 دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير Eclipse
 C++ In a Nutshell
الزيارات 1904 C++ In a Nutshell
 التطوير السريع للتطبيقات Rapid Application Development
الزيارات 1862 التطوير السريع للتطبيقات Rapid Application Development
 

الأكثر تصويتـا

 اعداد وتنصيب Qt
نتيجة التصويت 40 من 5 شخص اعداد وتنصيب Qt
 تخطيط البرامج Program Layout
نتيجة التصويت 40 من 6 شخص تخطيط البرامج Program Layout
 التطوير السريع للتطبيقات Rapid Application Development
نتيجة التصويت 29 من 4 شخص التطوير السريع للتطبيقات Rapid Application Development
 الدرس الثالث:تعريف slot جديدة
نتيجة التصويت 27 من 3 شخص الدرس الثالث:تعريف slot جديدة
 دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير Eclipse
نتيجة التصويت 22 من 3 شخص دليل تنصيب اطار عمل Qt ، حزمة MinGW ، بيئة التطوير Eclipse
 
 

سكربت story-script v1 برمجة bwady.com تطوير SudaNix