.xml auslesen



  • hi

    ich muss aus einer .xml datei daten auslesen

    <text>hallo</text>
    <x>12</x>
    <y>15</y>
    

    soll man auf eine lib zu greifen oder sich lieber den parser selber schreiben?
    wenn ich mir die libs so ansehe sind die mir etwas groß für sowas kleines.

    wenn man sowas selber machen würde, wie sollte man vorgehen?

    danke und guten rutsch euch allen! :xmas2:



  • Ich würde auf jeden Fall eine kleine Lib empfehlen.
    ticpp ist da recht schlank und bietet imo recht viel:

    http://code.google.com/p/ticpp/

    Wenn es absolut minimal ist (du also nur ein name oder so auslesen musst, kannst das selbst machen, aber für alles andere würd ich ne lib nehmen).



  • Kannst ja nen Parser mit Boost::Spirit und Regex-Syntax tippeln 🤡



  • Kóyaánasqatsi schrieb:

    Kannst ja nen Parser mit Boost::Spirit und Regex-Syntax tippeln 🤡

    genau das wollte ich nicht. boost ist an und für sich auch meine erste wahl gewesen. aber mir war das etwas zuviel aufwand für sowas kleines.

    drakon schrieb:

    Ich würde auf jeden Fall eine kleine Lib empfehlen.
    ticpp ist da recht schlank und bietet imo recht viel:

    http://code.google.com/p/ticpp/

    Wenn es absolut minimal ist (du also nur ein name oder so auslesen musst, kannst das selbst machen, aber für alles andere würd ich ne lib nehmen).

    klein, schlank und leicht. sowas hab ich gesucht! vielen dank drakon



  • ehhh peinliche frage aber wo ist denn der download
    habe nur den download zur doku gefunden



  • Ich empfehle tinyxml, hat sich bei mir schon mehrfach bewährt.



  • mussdochgehen schrieb:

    Ich empfehle tinyxml, hat sich bei mir schon mehrfach bewährt.

    ahh, ticpp reicht mir schon.

    hab den download gefunden hier
    http://ticpp.googlecode.com/svn/docs/files.html



  • ****
    -.- doch nicht, gibts doch nicht!

    bin ich blind oder was?





  • ticpp ist ein C++ Wrapper für TinyXML..



  • rapidxml ist ne template-library, da musst du nicht ne extra Library bauen und linken (oder die sourcen in dein Projekt einfügen). Ist verdammt schnell! Ungewohnt ist jedoch, dass den Objekten die name/value-Strings nicht gehören, das ist alles shared (drum auch recht schnell). Muss man sich selber um Speicher kümmern, oder den memory_pool nehmen.

    pugixml ist da angenehmer, aber wieder eine zu kompilierende lib. Ist auch verdammt schnell (vor allem gegnüber tinyxml), und kann XPath, was zum schnellen Finden von Nodes richtig praktisch ist 🙂

    drakon schrieb:

    ticpp ist ein C++ Wrapper für TinyXML..

    Eigentlich ist tinyxml selber schon in C++ geschrieben. ticpp verwendet templates und exceptions.
    Und templates hat der nicht ganz verstanden 😃 So Konstrukte wie die beiden

    template < class T >
    void IterateNext( const std::string& value, T** next ) const
    {
        Node* sibling = NextSibling( value, false );
        *next = dynamic_cast< T* >( sibling );
        while ( ( 0 != sibling ) && ( 0 == *next ) )
        {
            sibling = sibling->NextSibling( value, false );
            *next = dynamic_cast< T* >( sibling );
        }
    }
    

    oder

    template < class T >
    T* To() const
    {
        T* pointer = dynamic_cast< T* >( this );
        if ( 0 == pointer )
        {
            std::string thisType = typeid( this ).name();
            std::string targetType = typeid( T ).name();
            std::string thatType = typeid( *this ).name();
            TICPPTHROW( "The " << thisType.substr( 6 ) << " could not be casted to a " << targetType.substr( 6 )
    					<< " *, because the target object is not a " << targetType.substr( 6 ) << ". (It is a " << thatType.substr( 6 ) << ")" );
        }
        return pointer;
    }
    

    In fast jedem template ein dynamic_cast oder typeid... tinyxml selber scheint ja schon deutlich langsamer und speicherhungriger zu sein als die beiden obigen, und dann kommen da noch diese dynamic_casts im ticpp-wrapper...
    Das würde anders gelöst schöner und schneller gehen (z.B. mit einem

    enum {
        Type = 12 // CommentType
    };
    

    oder ähnlich. Das enum vergleichen und erst dann den dynamic_cast machen...
    Und die typeid().name()-Strings sind oft so kryptisch, die in ne Fehlermeldung zu packen ist, hmmm. Ein static-Member mit dem Namen sollte helfen. Soo viele Klassen sind das nicht, das braucht nur wenig Speicher.


Anmelden zum Antworten