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

أرجو المساعده : عملية Parsing XML to C++ using TinyXML

مغلق
بدأه Malik_88 في 10 ديسمبر 2011 · 12 رد · 2,013 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

اخواني عندي مشكله ... أنا أقوم بكتابة برنامج يقوم بتحويلXML File إلا C++ Objects عن طريق TinyXML

كتبت كل شيء ولكن لا استطيع تحويل العناصر الداخليه داخل ال-XML-File


void load(const char* pFilename)
{
cout << "Load started"<<endl;

TiXmlDocument doc(pFilename);
if (!doc.LoadFile()) return;

TiXmlHandle docHandle(&doc);



TiXmlElement* element = docHandle
.FirstChild("System")
.FirstChild( "Model" )
.FirstChild( "Component" )
.ToElement();
TiXmlElement* subComponent= element->FirstChild()->ToElement();


// attributes for the Compnonet

int id;
string name ;


// First loop to get the components
for( element; element; element=element->NextSiblingElement() )
{
name=element->Attribute("name");
id=atoi(element->Attribute("id"));
cout << name << " " <<id<<endl;


// The secound loop to get the subcomponents from the components
cout <<" The SubComonents are : "<<"\n";
for(subComponent;subComponent;subComponent=subComponent->NextSiblingElement())
{

id = atoi(subComponent->Attribute( "id"));
name=subComponent->Attribute("name");
cout << " -ID:"<<id<<
" Name : " << name<<endl;

}
}



}

int main()
{
load("system.xml");
return 0;
}

// XML FILEEEEEEEEEEEEEEEEEEEEEEE


<System depends="3">
<Model>
<Component id="1" name="THE SYSTEM" >
<Subcomponent id="2" name=" Control" ></Subcomponent>
<Subcomponent id="4" name="2D Laser">
<Subcomponent id="2" name="Scanner" ></Subcomponent>
<FailureMode id="57" name="Processing defect" ></FailureMode>
<FailureMode id="58" name="Not Detected" ></FailureMode>
</Subcomponent>


</Component>


</Model>

</System>




code.cpp

تم تعديل هذه المشاركة بواسطة Malik_88 في 10 ديسمبر 2011 في 22:42

#3
Blueteeth كتب:

قصدك على <FailureMode>؟

شكراً على الرد

أسف ما وضحت سؤالي جيداً ...... هذا المقطع من XML وهو ملف كبير شوي

المشكله إلي عندي إنه Compoenent يكون إلها عدد من الSupcomopenent وهي لها أيضاً عدد من ال-Subcompoent and Failuremode والأنا قدرت أطلع The elements from Level 1& 2

أنا قرأت عن شيء اسمو Visitor ..... لكن لا أدري كيف استخدمه ..... أنا أريد شيء كلIterator يدور الملف كامل لإخراج ال elements مع الحفاظ على الترتيب

إن شاء الله تكون فهمتني أخي الكريم

#4

بصراحة معرفش إما هو ال visitor, بس ممكن تستخدم 2 لووب داخل بعض لعمل مسح للفايل كاملاً, أو اﻹختيار اﻷسهل و هو إستخدام ال recursion.

void parse_element(TiXmlElement* e){
    // Read whatever attributes you want from the element e

    // Iterate through children if it has any
    if (!e->NoChildren ()){
        TiXmlElement* curr_child = e->FirstChild ();
        do{
            parse_element(curr_child);
        }while(curr_child = e->IterateChildren(curr_child));
    }
}
1
#5
Blueteeth كتب:

بصراحة معرفش إما هو ال visitor, بس ممكن تستخدم 2 لووب داخل بعض لعمل مسح للفايل كاملاً, أو اﻹختيار اﻷسهل و هو إستخدام ال recursion.

void parse_element(TiXmlElement* e){
    // Read whatever attributes you want from the element e

    // Iterate through children if it has any
    if (!e->NoChildren ()){
        TiXmlElement* curr_child = e->FirstChild ();
        do{
            parse_element(curr_child);
        }while(curr_child = e->IterateChildren(curr_child));
    }
}

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

بارك الله فيك حل منطقي وحلو لكن هناك مشكله في ال-:

error: invalid conversion from ‘TiXmlNode*’ to ‘TiXmlElement*’

في السطر : TiXmlElement* curr_child = e->FirstChild ();

حاولت أصلح فيها ما زبطت

عندك حل لهل مشكله أخي الكريم

#6

الدوال FirstChild() و IterateChildren() بيرجعوا كائن من نوع TiXmlNode* و لتحويله إلى TiXmlElement* إستخدم الدالة ToElement()

(e->FirstChild())->ToElement()

آسف لأنى لم أستخدم هذه المكتبة من قبل و كتبت الكود من غير مترجم.

#7
Blueteeth كتب:

الدوال FirstChild() و IterateChildren() بيرجعوا كائن من نوع TiXmlNode* و لتحويله إلى TiXmlElement* إستخدم الدالة ToElement()

(e->FirstChild())->ToElement()

آسف لأنى لم أستخدم هذه المكتبة من قبل و كتبت الكود من غير مترجم.

ما شاء الله عنك يا أخي الكريم ... إبداع ما شاء الله ... الله ييسرها في وجهك مثل ما يسرتها في وجهي

ولكن أخي الكريم ما تزال هناك مشكله بسيطه وهي عندما يصل إلي أسفل "النود " يعطي أن هناك خلل ولا يعود ليكمل من أعلى، انظر للكود :

PART OF THE XML:

<System depends="3">
<Model>
<Component id="1" name="MYSys" depends="">
<Subcomponent id="2" name="Control" depends="">
<Subcomponent id="3" name=" Detection" depends="">
        </Subcomponent>

<Subcomponent id="4" name="2D Laser " depends="56">
<FailureMode id="57" type="State" name="Processing " value="" depends="" comment=""/>
<FailureMode id="58" type="State" name="Obstacle Not Detected" value="" depends="" comment=""/>
<FailureMode id="59" type="State" name="Processing Did not adhere real-time requirements" value="" depends="" comment=""/>
</Subcomponent><Subcomponent id="5" name="3D Laser Obstacle Detection" depends="10">
<FailureMode id="63" type="State" name="Processing Did not adhere real-time requirements" value="" depends="" comment=""/>
</Subcomponent>
</Subcomponent>

void parse_element(TiXmlElement* e){
// Reading attrubutes 
    int id;
string name;
//name=e->Attribute("name");
id = atoi(e->Attribute("id"));
cout<< id<<endl;
//cout <<name<<endl;
    // Iterate through children if it has any
    if (!e->NoChildren ()){
        TiXmlElement* curr_child =(e->FirstChild())->ToElement();
        do{
            parse_element(curr_child->ToElement());
          }while(curr_child = (e->IterateChildren(curr_child))->ToElement());
    }
}

The Main Faile:

int main()
{
;
    TiXmlDocument doc("MySystem.xml");
    if (!doc.LoadFile()) return 0;// wenn i delete this line get the "Segmentation fault"

    TiXmlHandle docHandle(&doc);



    TiXmlElement* element = docHandle
                         .FirstChild("System")
                         .FirstChild( "Model" )
                         .FirstChild( "Component" )
                         .ToElement();
    parse_element(element);
        return 0;

 }

My Output is:

1
2
3
4
57
58
59
Segmentation fault

أنا أشوف إنه المشكله لما يوصل نهاية النود ما يقدر يرجع إلى الذي قبله

الله يجزيك الخير والله هذا بداية مشروع تخرجي وما لي غير الله ثم أنت .... الله يجزيك كل الخير

تحملني أخي إذا أطلت عليك

تم تعديل هذه المشاركة بواسطة Malik_88 في 13 ديسمبر 2011 في 02:27

#8

ممم طيب خللى اللوب كده و جرب

do{
            parse_element(curr_child->ToElement());

            TiXmlNode* next_child = e->IterateChildren(curr_child);
            curr_child = next_child? next_child->ToElement() : NULL;
          }while(curr_child);
1
#9
Blueteeth كتب:

ممم طيب خللى اللوب كده و جرب

do{
            parse_element(curr_child->ToElement());

            TiXmlNode* next_child = e->IterateChildren(curr_child);
            curr_child = next_child? next_child->ToElement() : NULL;
          }while(curr_child);

صار عندي Infinite loop

.
.
.
57
58
59
57
58
59
57
58
59
57
58
59
57
58
59
57
58
59
57
.
.
#10

أخي بلوتوث أنا طول الليل وأنا أحلل في الكود لأعرف أين الخلل ... استنتجت إنه الخل مو من الكود اللي كتبته إنت لئنه ما شاء الله كلو كان تمام

بس الخلل كان من ال-XML-File

والأن الحمدلله صار يطلعلي كل الId's

ولكن المشكله إلي أحاول أعدلها إنه يخذ فقط Component وحده وما يعمل للبقيه .

مشكور وجزاك الله خير

تم تعديل هذه المشاركة بواسطة Malik_88 في 13 ديسمبر 2011 في 15:28

#11

المفروض إن لما يوصل ﻵخر شايلد ترجع NULL! طيب ممكن تعمل debug و تشوف بيرجع إيه بالضبط عند آخر شايلد؟

#12

الحمدلله الأن كلو تمام

الأن مهمتي اني إخزنهم في Component>list>

إن شاء الله إذا صادفتني مشاكل ... أعرف الأن من يساعدني .... مشكور أخ بلوتوث .

Malik_88 كتب:

الحمدلله الأن كلو تمام

الأن مهمتي اني إخزنهم في Component>list>

إن شاء الله إذا صادفتني مشاكل ... أعرف الأن من يساعدني .... مشكور أخ بلوتوث .

قمت بتغير تعريف ال element عندي وخليته يبدأ منModel وليس منComponent وأضفتID إلى Model

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

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