العمل مع XML في C++: المكتبات pugixml وTinyXML-2 وRapidXML

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

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

ابدأ الدورة

العمل مع 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.

توصيات