الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

c++ and XML

مغلق
بدأه Super_emad55 في 17 يناير 2007 · 16 رد · 1,567 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم,

أولا: لكي تستطيع فهم هذا الموضوع يجب ان تكون تعاملت مع الـ 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

إن شاء الله يكون موضوع مفيد و سهل و خفيف و جديد على البعض. اذا كان هناك أي اسئله او استفسارات قبل وضع الدرس الثاني, انا جاهــــــــــــــــــــــــــــــــــــــز.

موفقين...

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#2

6)إضافة تعليق sComment : addcoments هو التعليق من نوع string

fprintf(fp,"<!--%s-->",sComment.c_str());

7)كيفية اضافة tag بهذا الشكل <Imad age="21" Profession="Software"> وهو ما يطلق عليه الـ Atributes: هذه الخاصيه تقوم على مرحلتين:

الأولى:

vectAttrData.push_back(sVal); 
vectAttrData.push_back(sKey);

ال sVal في هذا المثال هو 21 او Software اما ال sKey هي age او profession

اما ال vectAttrData هو من نوع vector string

الثانيه:

هو تكوين الـ tag بهذا الشكل :

	fprintf(fp,"<%s",sTag.c_str());
	while(0 < vectAttrData.size()/2)
	{
		string sTmp = vectAttrData.back();
		fprintf(fp," %s=", sTmp.c_str());
		vectAttrData.pop_back();
		sTmp = vectAttrData.back();
		fprintf(fp,"\"%s\"", sTmp.c_str());
		vectAttrData.pop_back();
	}
	vectAttrData.clear();
	fprintf(fp,">");
	sTagStack.push(sTag);// if it was for a parent tag
			or
fprintf(fp,">%s</%s>",sValue.c_str(),sTag.c_str());// if it was for a child tag

و بهذا نكون قد اتممنا اهم الاوامر المطلوبه لكتابة xml file

الدرس المقبل سوف يكون عن قرأة ال XML file وهو القسم الاصعب و الاكثر حماسا :rolleyes: :rolleyes: :rolleyes:

اذا كان هناك أي اسئله او استفسارات قبل وضع الدرس الثالث, انا جاهــــــــــــــــــــــــــــــــــــــز.

موفقين...

تم تعديل هذه المشاركة بواسطة Super_emad55 في 18 يناير 2007 في 00:28

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#3

جميل جداً أخ عماد ..

هناك الكثير من الـ Parsers للـ XML .. جميل أن تقوم بصناعة أحدها من الصفر.

عندي سؤال .. :)

أيهما أسرع عند التعامل مع الملفات الكبيرة DOM أو SAX ؟

بالتوفيق

#4

شكرا لك اخي خالد ,

كما ذكرت ان هناك نقاش كبير عن من الافضل (الافضل يعني الاسرع و الاقل استخدام للذاكرة), تلخيصا لكلام بعض الباحثين,

بما ان ال SAX لا يستخدم الذاكرة كما تقوم طريقة DOM بتكوين الـ Tree, فهو يستخدم الذاكرة بشكل اقل و هو اسرع من ال DOM عند قرأة المعلومات لاول مرة,

ولكن بعد قرأة المعلومات لاول مرة تصبح الDOM اكثر فعاليه و سرعه بغض النظر عن الذاكرة, فالـ tree المكونه من ال DOM تتيح لك كما يقال "دخول عشوائي لاي معلومه تريد الدخول اليها" او ما يسمى بـالـ random access

وهنا يرجع الخيار الى المبرمج, من الاكثر اهمية بالنسبه له في برنامجه, هل الذاكرة ام السرعه

من المعتاد ان عند الحاجه الى قراءة ملفات كبيرة يستخدم ال SAX ليس لموضوع السرعه ولكن لموضوع الذاكرة, طبعا فال DOM بعد قرأة المعلومات لاول مرة يصبح اسرع كما ذكرنا

ارجو ان اكون اوصلت المعلومه بشكل جيد.. :rolleyes:

تم تعديل هذه المشاركة بواسطة Super_emad55 في 18 يناير 2007 في 11:41

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#5

بسم الله الرحمن الرحيم,

قرأة ملف XML عن طريق الـ C++ : هذا الموضوع معقد الى حد ما, لذا اريد اذهان مفتحه :D

سوف استخدم الـ DOM لانها الطريقه الاصعب, فلو تعلمنا الاصعب, اصبح السهل اسهل ;)

اولا يجب تكوين كلاس NODE مناسب لتكوين ال tree:

الموضوع سوف يطول قليلا لان ضميري لا يطاوعني ان اكتب شئ من غير التفصيل عنه, فأنا استخدمت الـ Library map والتي اعرف ان الكثير لا يعرف عنها شئ, لانه قل ما تدرس في الجامعات او يذكر عنها الدكتور شئ, فالذي يعرفها يمكن ان يتفادى قراة ما بين الخطين

Map: هي عباره عن templated list, يتم تعريفها بهذا الشكل map<int,string> imad

الأول int:هو نوع الـ reference للعناصر, و string هي نوع العناصر

سوف اضع اهم الدوال الخاصة بها, وبذلك سوف تفهم استخداماتها:

سوف استخدم لفظ خريطه لـ map, محدش يضحك علي :D

وعنوان لـ address

begin

ترجع عنوان اول عنصر في الخريطه

clear

مسح جميع العناصر بالخريطه

count

ترجع عدد العناصر في الخريطه

empty

التأكد اذا ما كانت الخريطه خاليه ام لا

end

ترجع اخر عنصر في الخريطه

equal_range

ترجع اخر عنصر في الخريطه

erase

لمسح عنصر او مجموعة عناصر

find

البحث عن عنصر معين في الخريطه

insert

ادخال عنصر الى الخريطه

max_size

ترجع أقصى عدد من العناصرممكن تخزينه في الخريطه

size

ترجع عدد العناصر الموجوده في الخريطه

و هناك الكثير من الدوال الجميله, ولكن قمت بوضع الاهم

طبعا جميع الحقوق محفوظه لـ www.msdn.com وانا المترجم :D

يكمل الموضوع بالدرس الرابع...

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#6

مرحبا من جديد ..

شكراً أخ عماد على التوضيح , أعتقد أني فهمت المسألة .

المسألة هي المعضلة القديمة جداً Space Vs Time . :)

بالتوفيق

#7

تمام يا خالد, هذه المشكلة القديمة و القديمة جدا

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#8

بسم الله الرحمن الرحيم,

لنرى ما هي متطلبات تكوين كلاس ال NODE :

1) list تحفظ عناوين ال nodes و يكون ال reference لها integers:

typedef map<int, Node *> NodeMap;

2) iterator لتخزين عناصر الlist

typedef NodeMap::iterator NodeMapIter;

3) list لحفظ القيم الـ children nodes:

typedef map<string, string> StringMap;

4) ما نحتاج اليه من الـ private members :

	string NodeName; // Node Name
	int NodeCount; // Node counter
	Node * ParentNode; // address to parent node
	NodeMap ChildNodes; //list to save the children nodes
	StringMap ChildElements;  //list to store the elements of the children node
	int Object; // integer to store number of objects created

5) constructor لعمل intialization للـ node تأخذ اسم الnode وعناون الnode

Node(string s , Node* ptr)
{
	NodeName= s;
	ParentNode=ptr;
	Object++;
	NodeCount=0;
}

6) destructor لتدمير جميع ال nodes المكونه, بما اننا لا نكون أي كائن في الـ constructor, فنحن لا نحتاج الـ عمل delete في الـ destructor

~Node(){Object--;}

8) و ماتبقى من الدوال المهمة التي يمكن ان نحتاج اليها:

string GetElementValue(string s) // Get element value
{
	return ChildElements;
}
Node * GetFirstChild() // returns pointer to first child node
{
	NodeCount = 0;
	return ChildNodes[NodeCount++];
}
Node * GetNextChild() // returns pointer to first child node
{ 
return ChildNodes[NodeCount++];
}
long GetChildNodeCnt()// returns the number of chid nodes for te current node.
{
return ChildNodes.size();
}
Node* GetParentNode()// returns pointer to parent node.
{
return ParentNode;
}

Node * AddChildNode(string s)//adding a child node
{
	Node * Tmp = new Node(s,this);
	ChildNodes[NodeCtr++] = Tmp;
	return Tmp;
}
void AddElementVal(string key,string value)//adding value to an element
{
	ChildElements[Key] = val;
}
void ResetNodeCntr() // initialize the counter of nodes
{
NodeCount =0;
}
void ResetReading() // move the pointer to the parent node
{
for(NodeMapIter T = ChildNodes.begin();T != ChildNodes.end(); T++)
	{
		if(T->second != NULL) 
		{
			if( (T->second->GetChildNodeCnt() != 0))
				T->second->ResetReading();
			ResetNodeCntr();
		}
	}
}
string GetNodeName() // return the name of the current node
{
	Return NodeName;
}
int GetObjectCnt() // return the number of objects that are created
{
	Return { --Object;}
}







void DeleteAll()// delete all nodes
{
for(NodeMapIter T = ChildNodes.begin();T != ChildNodes.end(); T++)
	{
		if(T->second != NULL) 
		{
			if( (T->second->GetChildNodeCnt() != 0))
				T->second->DeleteAll();
			delete T->second;
		}
	}
	ChildNodes.clear(); // clear all ointers.
	ChildElements.clear(); // Clear all elements and vales
}

بالنتيجة نقوم بتكوين داخل الذاكرة شكل يشبه الصوره المرفقه

هاهو المرفق B)

memory1.zip

تم تعديل هذه المشاركة بواسطة Super_emad55 في 19 يناير 2007 في 15:17

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#9

ليست مشكله ، إنما هي طبيعة الحياه

تريد خدمات إذاً امنحني مكان

#10

انت محق اخي عيسى :)

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#11

أسف على الخطأ الموجود في المرفق اعلاه.

هذا هو التصحيح في هذا المرفق,

اعتذر عن هذا الخطأ البسيط :rolleyes:

memory1.zip

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#12

من الواضح ان شرحي وافي و مفصل فليس هناك الا سؤال واحد :P

شباب لا ارى تفاعل !!!!!!!!!!!!

المفروض ان موضوع كهذا يكون محمس, اريد حماس لكي اكمل, فمازال الموضوع في بدايته :rolleyes:

شباب هذا الموضوع لايدرس في كثير من الجامعات, فهو يعطى بشكل رئيسي بالJAVA فقـــــــــــــــط

موفقيـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــن...

تم تعديل هذه المشاركة بواسطة Super_emad55 في 20 يناير 2007 في 01:33

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#13

الله يعينك يا عماد على الشغل الكبير اللي عامله :P

بس و الله متابعين بس الظاهر الشباب بدهم مين يحللهم واجباتهم أول :D

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 20 يناير 2007 في 03:49

#14

:D:D:D

خذا واضح يا خالد ... المهم انه في على الاقل واحد بيقراء الموضوع و بيستفيد,

اذا حتجت اي حاجه, ارجو ان تخبرني

موفق

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#15

حتى ارى مقدرة الشباب, اريد من احدهم ان بكتب لي كود يعطي قائمة ارقام اصحابه

مثلا

<friend>
	<imad>
	   <phone>204239</phone>
	</imad>

   <salah>
	   <phone>23432</phone>
   </salah>

   <ahmad>
	   <phone>4535</phone>
   </ahmad>
</friend>

طبعا بتطبيق الدروس السابقه

اتمنى ان ارى تفاعل هذه المرة

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#16

اعطي فكرة عن الدرس المقبل, نود تكوين هذا الـ Object مثل الشكل الموجود في المرفق 1,

لنحصل على الشكل الكلي الموجود في مرفق 2

موفقين....

memory2.zip

memoryT.zip

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

#17

في الحقيقه انا لم أجد اي تفاعل, للاسف

سوف اوقف الدروس

سوف اضع كتاب عن هذا الموضوع ليكون مرجع لمن ارد... الكتاب قيد الانشاء

تم تعديل هذه المشاركة بواسطة Super_emad55 في 24 يناير 2007 في 02:23

ENG. IMAD, Programing is a way of life, It's in the air, we breath It's pumps through our veines, Without it, we soon crumble to dust

هذا الموضوع مغلق.

مواضيع مشابهة