Arbeit mit XML in C++: Bibliotheken PugiXML und RapidXML
XML (Extensible Markup Language) bleibt eines der wichtigsten Formate zur Speicherung und Übertragung strukturierter Daten. In C++ gibt es mehrere leistungsstarke Bibliotheken für die Arbeit mit XML, unter denen PugiXML (leichtgewichtig, mit XPath-Unterstützung) und RapidXML (maximal schnell, arbeitet "vor Ort") hervorstechen. In diesem Artikel werden wir beide Bibliotheken, ihre Besonderheiten, Installation und praktische Beispiele behandeln.
1. PugiXML – ein universelles Werkzeug
PugiXML ist eine leichtgewichtige, plattformunabhängige Bibliothek mit Unterstützung für XPath 1.0 und die Kodierungen UTF-8/UTF-16. Sie eignet sich ideal für die meisten Aufgaben: vom Lesen von Konfigurationsdateien bis zur komplexen Analyse von XML-Dokumenten.
Installation
Laden Sie die Header-Dateien von der offiziellen Website herunter oder verwenden Sie einen Paketmanager (vcpkg, Conan). Binden Sie sie in Ihr Projekt ein:
#include "pugixml.hpp"using namespace pugi;Beispiel: Laden und Lesen von XML
#include <iostream>#include "pugixml.hpp"
int main() { xml_document doc; if (!doc.load_file("config.xml")) { std::cerr << "Fehler beim Laden der Datei"; return -1; }
// Wurzelelement abrufen xml_node root = doc.child("settings"); for (xml_node node = root.child("param"); node; node = node.next_sibling("param")) { std::string name = node.attribute("name").as_string(); int value = node.attribute("value").as_int(); std::cout << "Parameter: " << name << " = " << value << ""; } return 0;}Beispiel: Erstellen eines XML-Dokuments
xml_document doc;xml_node root = doc.append_child("catalog");for (int i = 1; i <= 3; ++i) { xml_node item = root.append_child("item"); item.append_attribute("id") = i; item.append_child("name").text() = ("Produkt " + std::to_string(i)).c_str(); item.append_child("price").text() = 100.0 * i;}doc.save_file("catalog.xml");Vorteile von PugiXML:
- Unterstützung von XPath für komplexe Abfragen (z. B.
doc.select_nodes("//item[@id>1]")). - Arbeit mit Kodierungen und Unicode.
- Ausführliche Dokumentation und aktive Community.
2. RapidXML – Geschwindigkeit und Minimalismus
RapidXML ist eine Header-Only-Bibliothek, die XML ohne Kopieren der Daten parst (in-place). Sie ist deutlich schneller als PugiXML, unterstützt jedoch kein XPath und erfordert Vorsicht bei der Lebensdauer von Zeichenketten.
Installation
Kopieren Sie rapidxml.hpp und die zusätzlichen Dateien (rapidxml_utils.hpp, rapidxml_print.hpp) in Ihr Projekt.
Beispiel: Parsen eines Strings
#include <iostream>#include "rapidxml.hpp"
int main() { char xml[] = "<root><item id='1'>Wert</item></root>"; rapidxml::xml_document<> doc; doc.parse<0>(xml); // 0 — Parsing-Flags
rapidxml::xml_node<>* root = doc.first_node("root"); rapidxml::xml_node<>* item = root->first_node("item"); if (item) { std::cout << "ID: " << item->first_attribute("id")->value() << ""; std::cout << "Inhalt: " << item->value() << ""; } return 0;}Beispiel: XML-Erstellung
rapidxml::xml_document<> doc;rapidxml::xml_node<>* root = doc.allocate_node(rapidxml::node_element, "data");doc.append_node(root);
rapidxml::xml_node<>* child = doc.allocate_node(rapidxml::node_element, "value", "42");root->append_node(child);
// Ausgabe in einen Stringstd::string result;rapidxml::print(std::back_inserter(result), doc);std::cout << result;Wichtig:
Auch in der Bibliothek
Java Image I/O API: resize und crop von Bildern | Leitfaden
Arbeiten mit Daten in Rust: Überblick über Bibliotheken für Zeit und Kalender
HTTP-Client für JavaScript (Node.js): Top-Bibliotheken
Ramsey/UUID für PHP: Komplettguide mit Beispielen
Aufgabenwarteschlangen für Swift: Vollständiger Leitfaden zu GCD und Operation Queues