XML >>> über std::list iterieren und objekte mit membervariablen in XML



  • moin. ich hätte gerne ein paar hirnanstöße.
    ich habe in einer dynamischen liste objekte abgelegt und möchte über die liste iterieren und alle objekte mit samt ihren membervariablen in eine xml datei schreiben.

    die nächste frage ist: wie lese ich diese daten am besten aus dem file aus, wie instaniiere am besten?
    man soll sich das wie ein spielstand vorstellen, der gespeichert und geladen werden soll.

    freu mich auf antworten 😃



  • Kannst auch alles selber machen. Empfehle aber trotzdem eine xml-library
    z.b. http://www.grinninglizard.com/tinyxmldocs/index.html
    Kurt



  • benshman schrieb:

    ich habe in einer dynamischen liste objekte abgelegt und möchte über die liste iterieren und alle objekte mit samt ihren membervariablen in eine xml datei schreiben.

    Häh?

    myObject->save(aStream);
    // oder
    xmlDoc->append(myObject->createDomNode());
    // ...
    

    benshman schrieb:

    die nächste frage ist: wie lese ich diese daten am besten aus dem file aus, wie instaniiere am besten?

    Google: "Object Factory"



  • ZuK schrieb:

    Kannst auch alles selber machen. Empfehle aber trotzdem eine xml-library
    z.b. http://www.grinninglizard.com/tinyxmldocs/index.html
    Kurt

    der prof sagte was von einer xerces-c lib
    kennt dich damit jemand aus?

    ich habe nicht die leiseste vorstellung wie das schreiben eines "spielstandes" vonstatten gehen soll.

    tip: wir haben objekte mit koordinaten und anderen attributen in einer liste.[u]



  • benshman schrieb:

    der prof sagte was von einer xerces-c lib
    kennt dich damit jemand aus?

    Ja xerces ist natürlich auch in Ordnung.
    Da hast du aber noch einige Arbeit vor dir bevor du dir darüber Gedanken machen kannst wie du die Libraries ( xerces, oder tinyXML ) in deinem programm verwenden kannst. Entscheide dich erst mal für eine Library, schau dir die Doku an dann können wir ja weiterreden.
    Prinzipiell Ja XML ist das Richtige für dein Problem.



  • tolle sache. hab mir die doku mal angeschaut. ist ja soweit klar wie man sich einen baum aufbaut. aber ein rätsel ist mir immernoch wie man ein komplexes objekt in eine xml-struktur aufgegliedert bekommt.
    ich bin da ziemlich auf dem holzweg glaube ich. wenn...

    Class Game: Gtk::Window{
    ...
     std::list l<MyObject>;
     l.push_back(new MyObjekt1 ("param 1", "param2",100,0)); 
     l.push_back(new MyObjekt2 ("param 21", "param22",10,40));
     l.push_back(new MyObjekt3 ("param 31", "param32",100,0,40,50));
    ...
    };
    
    Class MyObjekt1:public MyObject{
     ObjektX ox1,ox2;
     int x,y;
     MyObject1(ObjectX::o1, ObjectX::o1, int arg_x, int arg_y){
       this->ox1=o1;
       this->ox2=o2;
       this->x=arg_x;
       this->y=arg_y;
     }
     ...
    };
    

    dann möchte ich die inhalte der liste entsprechend der attribute der objekte schön in xml hierachisch aufdröseln

    Mit

    DOMDocument* doc=anyDoc;
    DOMNode* rootNode=doc->getDocumentElement(); //root setzen
    
    DOMNode n = doc->createElement("foo");
    rootNode->appendChild(n);
    ...
    

    setze ich Knoten. ist klar.

    nur was schreibe ich wenn das XML file so aussehen soll:

    <MyObjekt1 attr1="param1" attr2="param2" attr3="100" attr4="0"/> 
    <MyObjekt2 attr21="param21" attr22="param22" attr23="10" attr24="40"/>
    ...
    

    Da müsste ich irgendwie an den Class Namen und die Attribute(Name) kommen.
    ist sowas wie toString() sinnvoll?



  • Ich würde das ungefähr so angehen

    class MyObject {
    public:
       virtual XMLElement * toXML( DOMDocument* ) = 0;
    };
    
    class MyObject1: public MyObject {
    public:
       virtual XMLElement * toXML( DOMDocument* doc ) { 
           XMLElement * ret = doc->createElement("MyObject1");
           ret->setAttribute("attr1", "param1");
           ret->setAttribute("attr2", "param2");
           return ret;
       }
    };
    
    Class Game: Gtk::Window{
    public:
        void toDOM() {
             DOMDocument* doc = .... ; 
             DOMNode* rootNode=doc->getDocumentElement();
             for ( std::list<MyObject*>::iterator i = l.begin(); i !=l.end(); ++ i ) {
                rootNode->appendChild((*i)->toXML(doc));
             } 
        }
    protected;
        std::list<MyObject*> l;
    
    };
    


  • *klatschhandvordenkopf*
    sieht um einiges besser aus. 😃



  • ZuK schrieb:

    Ich würde das ungefähr so angehen

    class MyObject {
    
    public:
       virtual XMLElement * toXML( DOMDocument* ) = 0;
    };
    

    Das element heisst

    DOMElement
    

Anmelden zum Antworten