العمل مع XML في C++: نظرة عامة على مكتبات تحليل وإنشاء مستندات XML
XML (لغة الترميز القابلة للتوسع) لا يزال تنسيقًا شائعًا لتخزين ونقل البيانات المنظمة، خاصة في ملفات التكوين وخدمات الويب (SOAP، XML-RPC) وتبادل البيانات بين الأنظمة. لا يوجد في C++ دعم مدمج لـ XML (باستثناء MSXML القديم)، لذلك يلجأ المطورون إلى المكتبات الخارجية. في هذه المقالة، سنستعرض ثلاثة من أشهر وأخف المكتبات للعمل مع XML في C++: TinyXML-2 وPugiXML وRapidXML. ستتعلم كيفية تثبيت كل منها، وكيفية تحليل وإنشاء مستندات XML، بالإضافة إلى مقارنة أدائها وسهولة استخدامها.
1. TinyXML-2
TinyXML-2 هي مكتبة بسيطة وخفيفة تتكون من ملفين فقط (tinyxml2.h وtinyxml2.cpp). إنها مثالية للمشاريع الصغيرة التي لا تتطلب أداءً عاليًا، ولكن البساطة في التكامل مهمة. المكتبة مرخصة بموجب Zlib، مما يسمح باستخدامها بحرية في المشاريع التجارية.
التثبيت
انسخ الملفين tinyxml2.h وtinyxml2.cpp من المستودع الرسمي إلى مشروعك وقم بتضمينهما. لا توجد تبعيات إضافية مطلوبة.
مثال: قراءة XML
#include "tinyxml2.h"#include <iostream>
int main() { tinyxml2::XMLDocument doc; doc.LoadFile("config.xml");
tinyxml2::XMLElement* root = doc.RootElement(); if (root) { const char* value = root->FirstChildElement("setting")->GetText(); std::cout << "Setting: " << value << std::endl; } return 0;}مثال: إنشاء XML
#include "tinyxml2.h"
int main() { tinyxml2::XMLDocument doc; tinyxml2::XMLDeclaration* decl = doc.NewDeclaration(); doc.InsertFirstChild(decl);
tinyxml2::XMLElement* root = doc.NewElement("root"); root->SetAttribute("version", "1.0"); doc.InsertEndChild(root);
tinyxml2::XMLElement* child = doc.NewElement("item"); child->SetText("Hello, XML!"); root->InsertEndChild(child);
doc.SaveFile("output.xml"); return 0;}2. PugiXML
PugiXML هي مكتبة أسرع وأكثر وظيفية من TinyXML-2. تدعم XPath، والعمل مع ترميزات UTF-8/16، ولها واجهة برمجة تطبيقات مريحة. غالبًا ما تُستخدم PugiXML في المشاريع التي تتطلب توازنًا بين السرعة والراحة. يتم توزيعها بموجب ترخيص MIT.
التثبيت
قم بتنزيل المصادر من GitHub وأضف pugixml.cpp وpugixml.hpp إلى المشروع. لاستخدام XPath، أضف PUGIXML_HAS_XPATH إلى تعريفات المعالج المسبق.
مثال: قراءة XML باستخدام XPath
#include "pugixml.hpp"#include <iostream>
int main() { pugi::xml_document doc; doc.load_file("data.xml");
pugi::xpath_node result = doc.select_node("//item[@id='1']"); if (result) { std::cout << "Found: " << result.node().child_value() << std::endl; } return 0;}مثال: إنشاء XML
#include "pugixml.hpp"
int main() { pugi::xml_document doc; pugi::xml_node root = doc.append_child("configuration"); root.append_attribute("version") = "2.0";
pugi::xml_node param = root.append_child("param"); param.append_attribute("name") = "timeout"; param.text().set("30");
doc.save_file("config.xml"); return 0;}3. RapidXML
RapidXML هي أسرع مكتبة لتحليل XML في C++. تعمل في المكان (تعدل النص الأصلي