العمل مع YAML في C++: مكتبات yaml-cpp و rapidyaml

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع YAML في C++: مكتبات yaml-cpp و rapidyaml

\n\n

YAML (YAML Ain't Markup Language) هو تنسيق لتسلسل البيانات يُستخدم على نطاق واسع لملفات التكوين، وملفات وصف البيئة (Docker Compose، Kubernetes)، وكذلك لتبادل البيانات بين الخدمات. على عكس JSON، فإن YAML أكثر قابلية للقراءة من قبل الإنسان بفضل المسافات البادئة ودعم التعليقات.

\n\n

لا يحتوي C++ على دعم مدمج لـ YAML، ولكن توجد مكتبات خارجية ممتازة. في هذه المقالة، سننظر في المكتبتين الأكثر شيوعًا: yaml-cpp (كلاسيكية، بسيطة) و rapidyaml (حديثة، سريعة جدًا). ستتعلم كيفية تثبيت المكتبات، وقراءة ملف YAML، وإنشائه برمجيًا، ومعالجة الأخطاء النموذجية.

\n\n

1. مكتبة yaml-cpp

\n\n

yaml-cpp هي المكتبة القياسية الفعلية للعمل مع YAML في C++. توفر واجهة برمجة تطبيقات (API) ملائمة تشبه العمل مع حاويات STL. تدعم المكتبة مواصفات YAML 1.2.

\n\n

التثبيت

\n\n

أسهل طريقة هي استخدام مدير الحزم vcpkg أو Conan. بالنسبة لنظامي Linux/macOS:

\n\n
# التثبيت عبر vcpkg\nvcpkg install yaml-cpp\n\n# التثبيت عبر Conan\nconan install yaml-cpp/0.7.0@
\n\n

إذا كنت تفضل البناء يدويًا، قم بتنزيل الكود المصدري من GitHub ونفذ:

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

تحليل ملف YAML

\n\n

لنفترض أن لدينا ملف تكوين 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

مثال على القراءة والوصول إلى البيانات في C++:

\n\n
#include <yaml-cpp/yaml.h>\n#include <iostream>\n#include <string>\n\nint main() {\n    try {\n        // تحميل الملف\n        YAML::Node config = YAML::LoadFile("config.yaml");\n\n        // الوصول إلى العقد المتداخلة\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        // التحقق من وجود المفتاح\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        // التكرار عبر التسلسل (القائمة)\n        // افترض أن YAML يحتوي على حقل: 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

إنشاء مستند YAML

\n\n

باستخدام yaml-cpp، لا يمكنك القراءة فحسب، بل يمكنك أيضًا توليد YAML:

\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                    

توصيات