العمل مع XML في Rust: المكتبات quick-xml وroxmltree وserde_xml_rs

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

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

ابدأ الدورة

العمل مع XML في Rust: مراجعة المكتبات الرئيسية



لا يزال XML تنسيقًا مطلوبًا لملفات التكوين وتبادل البيانات في الأنظمة القديمة وتخزين المعلومات المنظمة. في نظام Rust البيئي، توجد عدة مكتبات ناضجة للعمل مع XML، كل منها موجهة لسيناريوهات محددة: من التحليل التدفقي عالي الأداء إلى إلغاء التسلسل المريح في هياكل محددة الأنواع بدقة. في هذه المقالة، سنستعرض ثلاث مكتبات رئيسية: quick-xml وroxmltree وserde_xml_rs، وسنقدم أمثلة عملية على استخدامها.



مكتبة quick-xml: تحليل تدفقي سريع



quick-xml هي واحدة من أسرع المكتبات للعمل مع XML في Rust. صُممت لتكون ذات تكاليف إضافية ضئيلة واستهلاك منخفض للذاكرة. مبدأ العمل الأساسي هو التحليل التدفقي (streaming). تقرأ XML بشكل تسلسلي، وتعالج الأحداث: علامات الفتح والإغلاق، النص، التعليقات.



هذا النهج مثالي لمعالجة الملفات الكبيرة (مئات الميغابايت) حيث يكون نموذج DOM (تحميل المستند بأكمله في الذاكرة) غير قابل للتطبيق. تدعم المكتبة قراءة وكتابة XML.



مثال: قراءة تكوين باستخدام quick-xml



لنفترض أن لدينا ملف XML بسيطًا config.xml:



<config>    <app name="my_app">        <port>8080</port>        <host>localhost</host>    </app></config>


التحليل باستخدام quick-xml وواجهة برمجة التطبيقات عالية المستوى Reader:



use quick_xml::Reader;use quick_xml::events::Event;

fn main() -> Result<(), Box<dyn std::error::Error>> { let xml = r#" <config> <app name="my_app"> <port>8080</port> <host>localhost</host> </app> </config> "#;

let mut reader = Reader::from_str(xml); let mut txt = Vec::new(); let mut in_port = false;

loop { match reader.read_event() { Ok(Event::Start(ref e)) => { if e.name().as_ref() == b"port" { in_port = true; } } Ok(Event::Text(ref e)) => { if in_port { txt.push(e.unescape()?.to_string()); in_port = false; } } Ok(Event::Eof) => break, Err(e) => panic!("Error at position {}: {:?}", reader.buffer_position(), e), _ => () } } println!("Port value: {}", txt[0]); Ok(())}


كما ترى، الكود أمر ويتطلب إدارة يدوية للحالة، لكنه يمنحك تحكمًا كاملاً في عملية التحليل.



مكتبة roxmltree: العمل مع شجرة DOM



إذا كنت تفضل العمل مع XML كشجرة من الكائنات (DOM)، فإن roxmltree هي خيار ممتاز. تقوم بتحميل المستند بأكمله في الذاكرة وتوفر طرقًا ملائمة للتنقل: البحث باستعلامات شبيهة بـ XPath، واجتياز العناصر الفرعية، والحصول على السمات.



المكتبة لا تدعم التسلسل (كتابة XML)، لكنها مريحة جدًا للقراءة والتحليل. ميزة مهمة هي التحقق الصارم من مساحات الأسماء (namespaces).



مثال: البحث عن عناصر باستخدام roxmltree



use roxmltree::Document;

fn main() -> Result<(), Box<dyn std::error::Error>> { let xml = r#" <catalog> <book id="1"> <title>Rust in Action</title> <author>Tim McNamara</author> </book> <book id="2"> <title>Programming Rust</title> <author>Jim Blandy</author> </book> </catalog> "#;

let doc = Document::parse(x

توصيات