Arbeiten mit XML in C++: Bibliotheken pugixml, TinyXML-2 und RapidXML

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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.

Empfehlungen