Arbeit mit YAML in C++: Bibliotheken yaml-cpp und rapidyaml

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

Arbeit mit YAML in C++: Bibliotheken yaml-cpp und rapidyaml

\n\n

YAML (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\n

C++ 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\n

1. Die Bibliothek yaml-cpp

\n\n

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

\n\n

Installation

\n\n

Der 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\n

Wenn Sie es lieber manuell kompilieren möchten, laden Sie den Quellcode von GitHub herunter und führen Sie Folgendes aus:

\n\n
mkdir build && cd build\ncmake ..\ncmake --build .\nsudo cmake --install .
\n\n

Parsen einer YAML-Datei

\n\n

Angenommen, wir haben eine Konfigurationsdatei config.yaml:

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

Beispiel 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\n

Erstellen eines YAML-Dokuments

\n\n

Mit yaml-cpp können Sie nicht nur lesen, sondern auch YAML generieren:

\n\n
#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                    

Empfehlungen