العمل مع XML في C++: اختيار مكتبة لتحليل وإنشاء المستندات
XML (لغة الترميز القابلة للتوسع) لا تزال واحدة من التنسيقات الرئيسية لتخزين ونقل البيانات المنظمة. في C++، لا يوجد دعم مدمج لـ XML (باستثناء MSXML القديم)، لذلك يستخدم المطورون مكتبات خارجية. في هذه المقالة، سنستعرض ثلاث مكتبات خفيفة الوزن الأكثر شيوعًا: pugixml وTinyXML-2 وRapidXML. جميعها تعمل بدون تبعيات خارجية، وتدعم UTF-8، ومناسبة للأنظمة المدمجة.
1. pugixml — الخيار الشامل
pugixml هي أسرع وأكثر المكتبات وظيفية بين الحلول "خفيفة الوزن". تدعم XPath والمعالجة التدفقية وواجهة برمجة تطبيقات مريحة على غرار STL.
التثبيت: يكفي نسخ pugixml.hpp وpugixml.cpp إلى المشروع.
مثال: تحليل وقراءة XML
#include "pugixml.hpp"#include <iostream>
int main() { pugi::xml_document doc; pugi::xml_parse_result result = doc.load_file("config.xml");
if (!result) { std::cerr << "خطأ: " << result.description() << std::endl; return 1; }
// الحصول على العنصر الجذر pugi::xml_node root = doc.child("configuration");
// المرور عبر جميع العناصر <parameter> for (pugi::xml_node param : root.children("parameter")) { std::string name = param.attribute("name").value(); std::string value = param.child_value("value"); std::cout << name << " = " << value << std::endl; }
return 0;}إنشاء مستند XML
pugi::xml_document doc;pugi::xml_node root = doc.append_child("root");root.append_attribute("version") = "1.0";
pugi::xml_node item = root.append_child("item");item.append_attribute("id") = 1;item.append_child("name").text().set("مثال");item.append_child("price").text().set(99.99);
doc.save_file("output.xml");الميزات:
- دعم XPath 1.0 للاستعلامات المعقدة.
- العمل مع ترميزات UTF-8/16/32.
- وضع التحليل "الكسول" للملفات الكبيرة.
2. TinyXML-2 — البساطة والموثوقية
TinyXML-2 هو خليفة TinyXML الكلاسيكي، محسّن من حيث استخدام الذاكرة. مثالي للمشاريع البسيطة التي لا تحتاج إلى XPath.
التثبيت: ملفان: tinyxml2.h وtinyxml2.cpp.
مثال: قراءة السمات
#include "tinyxml2.h"#include <iostream>
int main() { tinyxml2::XMLDocument doc; tinyxml2::XMLError err = doc.LoadFile("data.xml");
if (err != tinyxml2::XML_SUCCESS) { std::cerr << "خطأ في التحميل: " << doc.ErrorStr() << std::endl; return 1; }
tinyxml2::XMLElement* element = doc.FirstChildElement("book"); if (element) { const char* title = element->Attribute("title"); int pages = element->IntAttribute("pages"); std::cout << "كتاب: " << title << ", صفحات: " << pages << std::endl; }
return 0;}إنشاء XML
tinyxml2::XMLDocument doc;tinyxml2::XMLDeclaration* decl = doc.NewDeclaration();doc.InsertFirstChild(decl);
tinyxml2::XMLElement* root = doc.NewElement("catalog");doc.InsertEndChild(root);
tinyxml2::XMLElement* product = doc.NewElement("product");product->SetAttribute("id", 101);product->SetText("حاسوب محمول");root->InsertEndChild(product);
doc.SaveFile("catalog.xml");المزايا:
- استهلاك ضئيل للذاكرة (بدون نسخ السلاسل النصية).
- واجهة برمجة تطبيقات بسيطة وبديهية.
- دعم تعليقات XML وCDATA.
3.
أيضاً في المكتبة
إرسال البريد الإلكتروني باستخدام JavaScript (Node.js): nodemailer, sendgrid, mailgun
Ehcache لجافا: دليل شامل مع أمثلة عملية
FastEndpoints في C# (.NET): دليل شامل مع أمثلة عملية
استخدام GraphQL في Swift: مكتبات Apollo و Relay لنظامي iOS/macOS