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

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

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

ابدأ الدورة

العمل مع XML في Rust: مراجعة المكتبات وأمثلة عملية



Rust هي لغة برمجة نظامية حديثة تُستخدم بشكل متزايد لإنشاء خدمات ويب عالية التحميل وأدوات سطر الأوامر والأنظمة المدمجة. عند العمل مع البيانات، غالبًا ما تنشأ الحاجة إلى معالجة مستندات XML. على عكس Python، حيث تغطي المكتبة القياسية xml.etree.ElementTree معظم المهام، تقدم بيئة Rust العديد من الكريتات (crates) المتخصصة ذات الأساليب المختلفة. في هذه المقالة، سنستعرض ثلاث أدوات شائعة للعمل مع XML في Rust: roxmltree و quick-xml و serde-xml-rs.



1. roxmltree — محلل سريع وآمن للقراءة فقط



roxmltree هو كريت مخصص حصريًا لقراءة XML. لا يدعم التعديل أو إنشاء المستندات، لكنه يوفر محللًا سريعًا وموثوقًا مع دعم كامل لمساحات الأسماء (namespaces). الميزة الرئيسية هي العمل مع البيانات المستعارة (zero-copy)، مما يقلل من تخصيص الذاكرة.



// cargo add roxmltreeuse roxmltree::Document;

fn main() -> Result<(), roxmltree::Error> { let xml = r#" <root> <item id="1">العنصر الأول</item> <item id="2">العنصر الثاني</item> </root>"#;

let doc = Document::parse(xml)?;

// الحصول على العنصر الجذر let root = doc.root_element(); println!("العنصر الجذر: {}", root.tag_name().name());

// البحث عن جميع العناصر الفرعية <item> for item in root.children().filter(|n| n.has_tag_name("item")) { let id = item.attribute("id").unwrap_or("unknown"); let text = item.text().unwrap_or(""); println!("المعرف: {}, النص: {}", id, text); }

Ok(())}


متى تستخدم: إذا كنت تحتاج فقط إلى قراءة ملفات XML (الإعدادات، ردود API، خلاصات RSS) وتهتم بأقصى أداء. roxmltree مثالي للتحليل لمرة واحدة.



2. quick-xml — محلل متعدد الاستخدامات يدعم القراءة والكتابة



quick-xml هو الكريت الأكثر شيوعًا للعمل مع XML في Rust. يدعم كلاً من التحليل (على أساس الأحداث وشبيه DOM) والتسلسل (الكتابة) لـ XML. يعمل مع التدفقات (Reader) ومع السلاسل الكاملة. يدعم السمات و CDATA والتعليقات وتسلسلات الهروب.



// cargo add quick-xmluse quick_xml::Reader;use quick_xml::events::Event;

fn main() -> Result<(), quick_xml::Error> { let xml = r#"<library> <book genre="rust">البرمجة بلغة Rust</book> <book genre="python">Python للمبتدئين</book></library>"#;

let mut reader = Reader::from_str(xml); reader.trim_text(true); let mut txt = String::new(); let mut current_genre = String::new();

loop { match reader.read_event_into(&mut txt) { Ok(Event::Start(ref e)) => { if e.name().as_ref() == b"book" { // الحصول على السمة genre if let Some(attr) = e.attributes().flatten().find(|a| a.key.as_ref() == b"genre") { current_genre = String::from_utf8_lossy(&attr.value).to_string(); } } } Ok(Event::Text(ref e)) => { let text = e.unescape()?; println!("النوع: {}, العنوان: {}", current_genre, text); } Ok(Event::Eof) => break, Err(e) => panic!("خطأ: {:?}", e), _ => {} } txt.clear(); } Ok(())}


متى تستخدم: إذا كنت بحاجة إلى مرونة — قراءة ملفات كبيرة بشكل تدفقي، إنشاء مستندات XML جديدة أو

توصيات