Arbeiten mit XML in C++: Eine Bibliothek zum Parsen und Erstellen von Dokumenten auswählen
XML (eXtensible Markup Language) bleibt eines der wichtigsten Formate zum Speichern und Übertragen strukturierter Daten. In C++ fehlt eine integrierte XML-Unterstützung (außer dem veralteten MSXML), daher verwenden Entwickler externe Bibliotheken. In diesem Artikel betrachten wir die drei beliebtesten leichten Bibliotheken: pugixml, TinyXML-2 und RapidXML. Alle arbeiten ohne externe Abhängigkeiten, unterstützen UTF-8 und eignen sich für eingebettete Systeme.
1. pugixml – die universelle Wahl
pugixml ist die schnellste und funktionsreichste Bibliothek unter den „leichten“ Lösungen. Sie unterstützt XPath, Streaming-Verarbeitung und eine praktische API im STL-Stil.
Installation: Es reicht aus, pugixml.hpp und pugixml.cpp in das Projekt zu kopieren.
Beispiel: XML parsen und lesen
#include "pugixml.hpp"#include <iostream>
int main() { pugi::xml_document doc; pugi::xml_parse_result result = doc.load_file("config.xml");
if (!result) { std::cerr << "Fehler: " << result.description() << std::endl; return 1; }
// Wurzelelement abrufen pugi::xml_node root = doc.child("configuration");
// Alle <parameter>-Elemente durchlaufen for (pugi::xml_node param : root.children("parameter")) { std::string name = param.attribute("name").value(); std::string value = param.child_value("value"); std::cout << name << " = " << value << std::endl; }
return 0;}XML-Dokument erstellen
pugi::xml_document doc;pugi::xml_node root = doc.append_child("root");root.append_attribute("version") = "1.0";
pugi::xml_node item = root.append_child("item");item.append_attribute("id") = 1;item.append_child("name").text().set("Beispiel");item.append_child("price").text().set(99.99);
doc.save_file("output.xml");Besonderheiten:
- Unterstützung von XPath 1.0 für komplexe Abfragen.
- Arbeit mit Kodierungen UTF-8/16/32.
- „Lazy“-Parsing-Modus für große Dateien.
2. TinyXML-2 – Einfachheit und Zuverlässigkeit
TinyXML-2 ist der Nachfolger des klassischen TinyXML, optimiert für den Speicherverbrauch. Ideal für einfache Projekte, bei denen kein XPath benötigt wird.
Installation: Zwei Dateien: tinyxml2.h und tinyxml2.cpp.
Beispiel: Attribute lesen
#include "tinyxml2.h"#include <iostream>
int main() { tinyxml2::XMLDocument doc; tinyxml2::XMLError err = doc.LoadFile("data.xml");
if (err != tinyxml2::XML_SUCCESS) { std::cerr << "Ladefehler: " << doc.ErrorStr() << std::endl; return 1; }
tinyxml2::XMLElement* element = doc.FirstChildElement("book"); if (element) { const char* title = element->Attribute("title"); int pages = element->IntAttribute("pages"); std::cout << "Buch: " << title << ", Seiten: " << pages << std::endl; }
return 0;}XML erstellen
tinyxml2::XMLDocument doc;tinyxml2::XMLDeclaration* decl = doc.NewDeclaration();doc.InsertFirstChild(decl);
tinyxml2::XMLElement* root = doc.NewElement("catalog");doc.InsertEndChild(root);
tinyxml2::XMLElement* product = doc.NewElement("product");product->SetAttribute("id", 101);product->SetText("Laptop");root->InsertEndChild(product);
doc.SaveFile("catalog.xml");Vorteile:
- Minimaler Speicherverbrauch (ohne Zeichenkettenkopien).
- Einfache und intuitive API.
- Unterstützung von XML-Kommentaren und CDATA.
3.
Auch in der Bibliothek
parking_lot für Rust: Vollständige Anleitung mit Beispielen
Navigation Component für Kotlin: Komplettguide mit Beispielen
pybind11 für C++: Vollständiges Tutorial mit Beispielen
Geolokalisierung und Karten in Swift: CoreLocation und MapKit für iOS/macOS