MiniXmlParser in CPP

Aus LOMSO
Zur Navigation springen Zur Suche springen
Du bist hier : {{#youAreHere:MiniXmlParser in CPP}}



Mini XML Parser in C++

XML Parser gibt es viele. Aber es gibt nur wenige, die man im Source einfach anpassen kann und die einfach genug sind, um den Source auch in eigene Programme zu integrieren.

Ein einfacher Parser ist z.B. TinyXML.

TinyXML wurde fast vollständig überarbeitet und vereinfacht.

Herausgekommen ist ein Parser, der komplett in C++ implementiert ist. Es wurden wesentliche Teile vereinfacht und eine Schnittstelle zum Finden und Ändern von Werten hinzugefügt.

Download: Mini XML Parser in C++

Lizenz der Files

Zlib License in der Wikipedia

Die Lizenz steht in den Files.

Einige austauschbare Teile sind unabhängig vom Parser und wurden von mir komplett neu geschrieben.

Das sind:

  • 'namespace alloccheck' - Überwachung von new/delete
  • 'logger.cpp' - der Logger hier aus dem Wiki Logger_in_CPP
  • 'namespace ascii' - Lesen und Schreiben von Textfiles Text Read Write in CPP
  • 'namespace strings' - Teile aus der Stringfunktionssammlung aus dem Wiki StringHelpers_in_CPP


Diese Teile stehen unter der LGPL: GNU Lesser General Public License

Compiler

Es wird Standard C++ eingesetzt, daher ist der Code von allen modernen C++ Compilern übersetzbar.

C++11 wird verwendet, ebenso 'boost' http://www.boost.org/

Der von mir verwendete Compiler ist: gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

Für den Qt-Creator ist ein *.pro File dabei.

Beispiele

Alle Beispiele sind im File 'main.cpp'.

// schreibe alle Keys zum Lesen/Schreiben im XML

     examples::xml_path_to_string_const();

// lese Elemente und Attribute

     examples::get_element_attribute_values();

// parse und schreibe mit Einrückungen

     examples::pretty_print();

// string Konvertierungen, int/double

     examples::string_convert();

// erzeuge XMl document im speicher

     examples::xml_creator();

// setze Werte an Elementen und Attributen

     examples::set_element_attribute_values();

// schreibe Kommentare vor einem Element

     examples::add_comments();


Exception

Alle Fehler sind in einer Exceptionklasse txml::tMxmlException zusammengefasst.

Beispiel im Code:

   try{
      code ....
   } catch( txml::tMxmlException &ex ) {
      string msg = ex.what();
      logger::logger().Info( ex.lfm(), "tMxmlException: " + msg );
   } catch ( std::exception &rt ) {
      logger::logger().Fatal( lfm_, string( "Ex rt: " ) + rt.what() );
   }

Key Strings zur Suche im XML

Mit Textstrings, die den Pfad zu einem Element/Attribute enthalten, können Werte gesucht und geändert werden.

Beispiel:

ergibt den Wert des Elementes an Position "domain.os.type"  
ergibt den Wert des Attributes an Position "domain.os.type:arch"  

Elemente werden im Pfad durch '.' getrennt.

Attribute an einem Element werden durch ':' am Elementpfad angefügt.

Sind in der Liste der Childelemente mehrere Elemente mit gleichem Namen vorhanden, werden die Pfade im Keystring nach dem Element mit einer laufenden Nummer generiert.

domain.devices.interface:1.source:bridge

liest z.B. im 2. Element 'interface' das Childelement 'source' und daran das Attribute 'bridge'.

Die Zahlen und Attribute können gleichzeitig verwendet werden

domain.devices.interface:1.source:3:bridge

ist ein gültiger Key, der aber im Beispiel XML nichts liefert, das das 4. Element 'source' nicht vorhanden ist

Die Strings könne aus dem XML File erzeugt werden, s.u.

Beschreibung der Schnittstelle in txml.h

Konstruktor:

  tXmlInterface();

Lesen eines Wertes aus einem Element oder einem Attribute

  string getAt( string const& key  )const;
  int getIntAt( string const& key  )const;
  double getDoubleAt( string const& key  )const;

Setzen eines Wertes an einem Element,
der Key muss auf ein Element zeigen

  void setAt( string const& key, string const& value  );
  void setIntAt( string const& key, int value);
  void setDoubleAt( string const& key, double value );

Setzen eines Wertes an einem Attribute,
der Key muss auf ein Attribut zeigen

  void setAttributeAt( string const& key, string const& value  );
  void setIntAttributeAt( string const& key, int value  );
  void setDoubleAttributeAt( string const& key, double value  );


Hinzufügen eines Kommentars vor einem Element

     void setComment( string const& key, string const& comment );


Parser, XML ist in File,

  void Parse( string const& fn = "" );

lese Xml-Document, welches mit 'txml' aufgebaut wurde (siehe demo.cpp)
Parse() baut zusätzliche interne Strukturen auf, mit denen die Werte gesucht werden

  void Parse( txml::XmlDocument const& doc );

Schreiben des XML, formatiert, mit Einrückungen

     void Save( string const& fn = "" );

liest einen XML File und schreibt diesen formatiert nach 'fn' zurück

     void PrettyPrint( string const& fn = "" );

schreibt die Strings mit den Keys, inklusive der Werte nach 'fn'

     void PrintKeys( string const & fn )const;
     void PrintKeysAndValues( string const & fn, size_t w = 60 )const;


Schreibt die Strings mit den Keys als 'const std::string' nach 'fn'. (diese Zeilen können direkt in ein Programm übernommen werden)

     void PrintKeysAsConstStdStrings( string const & fn )const;


noch einige Hilfsfunktion zur Konvertierung von Werten, static

     static int strToInt( std::string const& s );
     static double strToDouble( std::string const& s );
     static std::string IntToString( int val, size_t w = 5 );
     static std::string DoubleToString( double val, std::string const& format = "%6.3lf" ) ;


Autor

Richard Albrecht

Benutzer:Rleofield