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

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

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

ابدأ الدورة

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



YAML (YAML Ain't Markup Language) هو تنسيق تسلسل بيانات قابل للقراءة البشرية، يُستخدم غالبًا لملفات التكوين، تبادل البيانات، وتخزين المعلومات المنظمة. في لغة C++، توجد مكتبة قوية وسهلة الاستخدام للعمل مع YAML وهي yaml-cpp. في هذه المقالة، سنستعرض بالتفصيل كيفية تثبيت، إعداد، واستخدام yaml-cpp لتحليل وإنشاء مستندات YAML.



تثبيت yaml-cpp



مكتبة yaml-cpp متاحة لمعظم المنصات. أسهل طريقة للتثبيت هي عبر مدير الحزم:



  • Ubuntu/Debian: sudo apt-get install libyaml-cpp-dev
  • macOS (Homebrew): brew install yaml-cpp
  • Windows (vcpkg): vcpkg install yaml-cpp


يمكن أيضًا البناء من المصدر عن طريق تنزيل المستودع من GitHub واستخدام CMake:



git clone https://github.com/jbeder/yaml-cpp.gitcd yaml-cppmkdir build && cd buildcmake ..makesudo make install


أساسيات العمل مع yaml-cpp



توفر المكتبة واجهة برمجة تطبيقات بديهية لتحميل، تعديل، وحفظ بيانات YAML. جميع أنواع البيانات تُخزن في حاوية YAML::Node، والتي يمكن أن تكون قيمة قياسية (scalar)، تسلسل (مصفوفة)، أو تعيين (قاموس).



مثال لملف YAML



لننظر إلى ملف التكوين التالي config.yaml:



database:  host: localhost  port: 5432  name: myapp  credentials:    user: admin    password: secret123

server: workers: 4 timeout: 30.5 debug: true

allowed_ips: - 192.168.0.1 - 192.168.0.2 - 10.0.0.1


تحليل ملف YAML



لتحميل البيانات من ملف، تُستخدم الدالة YAML::LoadFile():



#include <yaml-cpp/yaml.h>#include <iostream>#include <string>#include <vector>

int main() { try { // تحميل ملف YAML YAML::Node config = YAML::LoadFile("config.yaml");

// الوصول إلى البيانات المتداخلة عبر عامل التشغيل [] std::string host = config["database"]["host"].as<std::string>(); int port = config["database"]["port"].as<int>(); std::string user = config["database"]["credentials"]["user"].as<std::string>();

std::cout << "Database host: " << host << std::endl; std::cout << "Database port: " << port << std::endl; std::cout << "User: " << user << std::endl;

// العمل مع التسلسل (قائمة) YAML::Node ips = config["allowed_ips"]; std::vector<std::string> ipList; for (const auto& ip : ips) { ipList.push_back(ip.as<std::string>()); }

std::cout << "Allowed IPs: "; for (const auto& ip : ipList) { std::cout << ip << " "; } std::cout << std::endl;

} catch (const YAML::Exception& e) { std::cerr << "YAML Error: " << e.what() << std::endl; return 1; }

return 0;}


إنشاء وتسلسل YAML



تسمح yaml-cpp أيضًا بإنشاء مستندات YAML برمجيًا وحفظها في ملف:



#include <yaml-cpp/yaml.h>#include <fstream>

int main() { // إنشاء عقدة جذرية YAML::Node config;

// إضافة بيانات config["application"]["name"] = "MyApp"; config["application"]["version"] = 2.1; config["application"]["debug"] = false;

// إنشاء تسلسل config["features"].push_back("logging"); config["features"].push_back("caching"); config["features"].push_back("auth");

// إضافة بيانات متداخلة config["database"]["host"] = "localhost"; config["database"]["port"] = 3306;

// حفظ في ملف std::ofstream fout("output.yaml"); fout << config; fout.close();

return 0;}


أنواع العقد في yaml-cpp



يمكن التحقق من نوع العقدة باستخدام دوال مثل IsScalar()، IsSequence()، و IsMap():



YAML::Node node = YAML::Load("[1, 2, 3]");if (node.IsSequence()) {    std::cout << "هذا تسلسل" << std::endl;}

YAML::Node scalar = YAML::Load("hello");if (scalar.IsScalar()) { std::cout << "هذه قيمة قياسية" << std::endl;}


معالجة الأخطاء



عند تحليل YAML غير صالح، ترمي yaml-cpp استثناء من نوع YAML::Exception. يُوصى دائمًا باستخدام كتل try-catch:



try {    YAML::Node config = YAML::LoadFile("invalid.yaml");} catch (const YAML::Exception& e) {    std::cerr << "خطأ في تحليل YAML: " << e.what() << std::endl;}


أفضل الممارسات



  • استخدم YAML::Node كحاوية رئيسية لجميع البيانات
  • تحقق دائمًا من وجود المفتاح قبل الوصول إليه باستخدام config["key"]
  • استخدم .as<Type>() مع معالجة الاستثناءات للتحويل الآمن للأنواع
  • للملفات الكبيرة، استخدم YAML::Load() بدلاً من YAML::LoadFile() لتجنب تحميل الملف بأكمله في الذاكرة
  • اختبر ملفات YAML باستخدام مدقق نحوي قبل تحميلها في التطبيق


الخلاصة



مكتبة yaml-cpp هي أداة قوية ومرنة للعمل مع YAML في C++. سواء كنت بحاجة إلى تحليل ملفات التكوين، إنشاء بيانات YAML، أو تحويل البيانات بين التنسيقات المختلفة، فإن yaml-cpp توفر كل ما تحتاجه بواجهة برمجة تطبيقات نظيفة وسهلة الاستخدام. مع أمثلة الكود وأفضل الممارسات المذكورة أعلاه، يمكنك البدء في استخدام YAML في مشاريع C++ الخاصة بك بسرعة وكفاءة.

توصيات