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
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