beliebige Structs in XML schreiben



  • Hallo,

    nachdem mir bei meinem generischem Struct Getter so schnell geholfen wurde, habe ich auch schon mein nächstes Problem 😉

    - Ich bekomme eine Reihe von Structs, auf die ich keinen Einfluss habe.
    - Ich bekomme Daten, die ich in ein bestimmtes Struct schreibe per memcpy

    Nun möchte ich das befüllte Struct im XML Format speichern. Das File soll als Logfile dienen, daher sollten die XML Tags die Namen der Member des Structs haben.

    Also z.B. so:

    struct s1
    {
       int a;
       int b;
       int c;
    }
    
    <s1>
       <a>3</a>
       <b>5</b>
       <c>7</f>
    </s1>
    

    Das ganze sollte natürlich generisch sein, also für verschiedene Structs funktionieren.

    Gibt es eine empfehlenswerte Lib, die das einfach bewerkstelligt?



  • TinyXML
    http://www.grinninglizard.com/tinyxml/

    Benutze ich sehr gerne, einfach zu integrieren und einfach zu verwenden.
    lg



  • Sorry für Doppelpost:
    Der macht das mit den Namen natürlich nicht automatisch.. das musste schon selber eingeben. Da gibts auch denke ich nix was das automatisiert.



  • Ja, exakt. TinyXML hab ich mir schon angeschaut. XMLs erzeugen ist damit kein Problem. Aber Structs serialisieren und ins das File schreiben mit Membernamen geht wohl nicht so einfach.

    In C# geht das ganze mit Bordmitteln:

    public struct myStruct
        {
            public int a;
            public int b;
            public int c;
            public int d;
        }
    
        class Program
        {       
            static void Main(string[] args)
            {
                myStruct s;
                s.a = 1;
                s.b = 2;
                s.c = 3;
                s.d = 4;
                System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(myStruct));
                System.IO.StreamWriter stream = new System.IO.StreamWriter("C:\\test.xml");            
                x.Serialize(stream, s);
                stream.Close();
            }
        }
    

    Erzeugt:

    <?xml version="1.0" encoding="utf-8"?>
    <myStruct xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <a>1</a>
      <b>2</b>
      <c>3</c>
      <d>4</d>
    </myStruct>
    

    Daher frage ich mich, ob es nicht vielleicht eine Lib gibt, die genau das auch macht.



  • Boost.Serialization?



  • defox: So einfach geht das natürlich dann nicht in C++ da du ja in C++ keine Reflexion hast. Du musst dann schon ein wenig mehr tun um das so serialisiert zu bekommen.



  • leetfan schrieb:

    TinyXML
    http://www.grinninglizard.com/tinyxml/

    Benutze ich sehr gerne, einfach zu integrieren und einfach zu verwenden.
    lg

    Ich bin mit TinyXML nie so recht warm geworden. Dass ein std::string (oder TiXmlString) notwendig ist, hab ich nie gepeilt.
    Warum TiCPP "modern" ist hab ich auch nicht verstanden. Ach ja, Exceptions und templates waren da angeführt...

    /**
    		@internal
    		Just for Iterator<>
    
    		@param value The value of nodes to iterate through
    		@param next [OUT] The pointer to the next valid node
    		*/
    		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 );
    			}
    		}
    

    Jippie!

    Ich denke, rapidxml ist deutlich effizienter, angenehmer (Header-Only!), und für so kleine Sachen wie geschaffen.

    Wer es komfortabler will, nimmt pugixml. Der kann (im Gegensatz zu tinyxml) XPath! Und ist immer noch längen schneller als TinyXML...


Anmelden zum Antworten