Arbeit mit YAML in C++: Bibliotheken yaml-cpp und rapidyaml
\n\nYAML (YAML Ain't Markup Language) ist ein Daten-Serialisierungsformat, das häufig für Konfigurationsdateien, Umgebungsbeschreibungsdateien (Docker Compose, Kubernetes) sowie für den Datenaustausch zwischen Diensten verwendet wird. Im Gegensatz zu JSON ist YAML für Menschen besser lesbar, da es Einrückungen und Kommentare unterstützt.
\n\nC++ hat keine integrierte Unterstützung für YAML, aber es gibt hervorragende Drittanbieter-Bibliotheken. In diesem Artikel betrachten wir die beiden beliebtesten: yaml-cpp (klassisch, einfach) und rapidyaml (modern, sehr schnell). Sie erfahren, wie Sie die Bibliotheken installieren, eine YAML-Datei lesen, programmatisch erstellen und typische Fehler behandeln.
\n\n1. Die Bibliothek yaml-cpp
\n\nyaml-cpp ist der De-facto-Standard für die Arbeit mit YAML in C++. Sie bietet eine benutzerfreundliche API, die an die Arbeit mit STL-Containern erinnert. Die Bibliothek unterstützt die YAML 1.2-Spezifikation.
Installation
\n\nDer einfachste Weg ist die Verwendung des Paketmanagers vcpkg oder Conan. Für Linux/macOS:
\n\n# Installation über vcpkg\nvcpkg install yaml-cpp\n\n# Installation über Conan\nconan install yaml-cpp/0.7.0@\n\nWenn Sie es lieber manuell kompilieren möchten, laden Sie den Quellcode von GitHub herunter und führen Sie Folgendes aus:
\n\nmkdir build && cd build\ncmake ..\ncmake --build .\nsudo cmake --install .\n\nParsen einer YAML-Datei
\n\nAngenommen, wir haben eine Konfigurationsdatei config.yaml:
server:\n host: "localhost"\n port: 8080\n debug: true\n\ndatabase:\n driver: "postgresql"\n connection_string: "host=localhost dbname=test"\n pool_size: 10\n\nBeispiel für das Lesen und den Zugriff auf Daten in C++:
\n\n#include <yaml-cpp/yaml.h>\n#include <iostream>\n#include <string>\n\nint main() {\n try {\n // Datei laden\n YAML::Node config = YAML::LoadFile("config.yaml");\n\n // Zugriff auf verschachtelte Knoten\n std::string host = config["server"]["host"].as<std::string>();\n int port = config["server"]["port"].as<int>();\n bool debug = config["server"]["debug"].as<bool>();\n\n std::cout << "Server: " << host << ":" << port\n << " (debug=" << (debug ? "on" : "off") << ")\\n";\n\n // Prüfen, ob ein Schlüssel existiert\n if (config["database"]["pool_size"]) {\n int pool = config["database"]["pool_size"].as<int>();\n std::cout << "Pool size: " << pool << "\\n";\n }\n\n // Iteration über eine Sequenz (Liste)\n // Angenommen, das YAML hat ein Feld: hosts: ["alpha", "beta", "gamma"]\n // for (const auto& h : config["hosts"]) {\n // std::cout << "Host: " << h.as<std::string>() << "\\n";\n // }\n\n } catch (const YAML::Exception& e) {\n std::cerr << "YAML parsing error: " << e.what() << "\\n";\n return 1;\n } catch (const std::exception& e) {\n std::cerr << "General error: " << e.what() << "\\n";\n return 1;\n }\n return 0;\n}\n\nErstellen eines YAML-Dokuments
\n\nMit yaml-cpp können Sie nicht nur lesen, sondern auch YAML generieren:
#include <yaml-cpp/yaml.h>\n#include <fstream>\n\nint main() {\n YAML::Emitter out;\n out << YAML::BeginMap;\n out << YAML::Key << "application";\n out << YAML::Value << "MyApp";\n out << YAML::Key << "version";\n out << YAML::Value << 2.5;\n out << YAML::Key << "features";\n out << YAML::Value << YAML::BeginSeq;\n out << "logging" << "auth" << "cache";\n ou