Rust में XML के साथ कार्य: लाइब्रेरीज़ और उपकरण
XML (eXtensible Markup Language) डेटा आदान-प्रदान, कॉन्फ़िगरेशन फ़ाइलों और दस्तावेज़ प्रबंधन के लिए एक प्रमुख प्रारूप बना हुआ है। Rust का इकोसिस्टम XML के साथ कार्य करने के लिए कई परिपक्व समाधान प्रदान करता है - उच्च-प्रदर्शन स्ट्रीमिंग पार्सिंग से लेकर serde के माध्यम से सुविधाजनक सीरियलाइज़ेशन तक। इस लेख में हम तीन सबसे लोकप्रिय उपकरणों पर चर्चा करेंगे: quick-xml, roxmltree और serde-xml-rs।
XML के साथ कार्य के लिए Rust क्यों?
Rust C/C++ की गति को मेमोरी सुरक्षा के साथ जोड़ता है। बड़ी XML फ़ाइलों (जैसे, मेडिकल रिकॉर्ड या जियोडेटा) को प्रोसेस करते समय यह महत्वपूर्ण है। Rust में XML लाइब्रेरीज़ पूरी तरह से Rust में (C से बाइंडिंग के बिना) लिखी गई हैं, जो थ्रेड-सुरक्षा और पूर्वानुमानित प्रदर्शन सुनिश्चित करती हैं।
Rust में XML के साथ कार्य के लिए लाइब्रेरीज़
- quick-xml — उच्च-प्रदर्शन स्ट्रीमिंग पार्सर (SAX-शैली) और राइटर। न्यूनतम मेमोरी खपत, बड़ी फ़ाइलों के लिए आदर्श।
- roxmltree — DOM पार्सर, जो दस्तावेज़ का ट्री बनाता है। नेविगेशन और संशोधन के लिए सुविधाजनक।
- serde-xml-rs —
serdeक्रेट के माध्यम से Rust संरचनाओं का XML में/से सीरियलाइज़ेशन/डीसीरियलाइज़ेशन। टाइप सिस्टम के साथ अधिकतम एकीकरण।
स्थापना
Cargo.toml में निर्भरताएँ जोड़ें:
[dependencies]quick-xml = "0.36" # स्ट्रीमिंग पार्सरroxmltree = "0.20" # DOM पार्सरserde-xml-rs = "0.6" # सीरियलाइज़ेशन (serde के साथ)serde = { version = "1.0", features = ["derive"] }quick-xml के साथ 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> के शीर्षक।
roxmltree के साथ DOM पार्सिंग
roxmltree पूरे XML को एक ट्री में लोड करता है। यह तब सुविधाजनक होता है जब आपको विभिन्न नोड्स तक बार-बार पहुँचने या संरचना को संशोधित करने की आवश्यकता होती है।
उदाहरण: विशेषताएँ और टेक्स्ट निकालना
use roxmltree::Document;
fn main() { let data = r#" <config version="1.0"> <database> <host>localhost</host> <port>5432</port> </database> </config>"#;\