العمل مع XML في Rust: المكتبات والأدوات
XML (لغة الترميز القابلة للتوسيع) لا يزال أحد التنسيقات الرئيسية لتبادل البيانات وملفات التكوين وإدارة المستندات. تقدم بيئة Rust عدة حلول ناضجة للعمل مع XML، بدءًا من التحليل التدفقي عالي الأداء إلى التسلسل المريح عبر serde. في هذه المقالة، سنستعرض ثلاث أدوات شائعة: quick-xml و roxmltree و serde-xml-rs.
لماذا Rust للعمل مع XML؟
يجمع Rust بين سرعة C/C++ وأمان الذاكرة. عند معالجة ملفات XML كبيرة (مثل السجلات الطبية أو البيانات الجغرافية)، يكون هذا أمرًا بالغ الأهمية. تمت كتابة مكتبات XML في Rust من الصفر بلغة Rust (بدون روابط إلى C)، مما يضمن أمان الخيوط وأداءً يمكن التنبؤ به.
مكتبات العمل مع XML في Rust
- quick-xml — محلل تدفقي عالي الأداء (نمط SAX) وكاتب. استهلاك ضئيل للذاكرة، مثالي للملفات الكبيرة.
- roxmltree — محلل DOM يبني شجرة المستند. مناسب للتنقل والتعديل.
- serde-xml-rs — تسلسل/إلغاء تسلسل هياكل Rust من/إلى XML عبر crate
serde. تكامل أقصى مع نظام الأنواع.
التثبيت
أضف التبعيات إلى Cargo.toml:
[dependencies]quick-xml = "0.36" # محلل تدفقيroxmltree = "0.20" # محلل DOMserde-xml-rs = "0.6" # تسلسل (مع serde)serde = { version = "1.0", features = ["derive"] }تحليل XML باستخدام quick-xml
يعمل quick-xml في وضع Reader — يقرأ الرموز المميزة بالتسلسل (فتح العلامة، النص، إغلاق العلامة). هذا يوفر الذاكرة: يمكنك معالجة المستند على أجزاء دون تحميله بالكامل.
مثال: قراءة خلاصة RSS
use quick_xml::Reader;use quick_xml::events::Event;
fn main() -> Result<(), Box<dyn std::error::Error>> { let xml = r#" <rss version="2.0"> <channel> <title>أخبار Rust</title> <item> <title>تم إصدار Rust 1.78</title> <link>https://example.com/rust-1.78</link> </item> </channel> </rss>"#;
let mut reader = Reader::from_str(xml); reader.trim_text(true);
let mut buf = Vec::new(); let mut in_item = false;
loop { match reader.read_event_into(&mut buf) { Ok(Event::Start(ref e)) => { if e.name().as_ref() == b"item" { in_item = true; } } Ok(Event::Text(ref e)) => { if in_item { let text = e.unescape()?; println!("{}", text); } } Ok(Event::End(ref e)) => { if e.name().as_ref() == b"item" { in_item = false; } } Ok(Event::Eof) => break, Err(e) => eprintln!("خطأ: {}", e), _ => () } buf.clear(); } Ok(())}الإخراج: عناوين جميع <item>.
تحليل DOM باستخدام roxmltree
يقوم roxmltree بتحميل XML بالكامل في شجرة. هذا مناسب عندما تحتاج إلى الوصول المتكرر إلى عقد مختلفة أو تعديل البنية.
مثال: استخراج السمات والنص
use roxmltree::Document;
fn main() { let data = r#" <config version="1.0"> <database> <host>localhost</host> <port>5432</port> </database> </config>"#;