Arbeit mit XML in Rust: Bibliotheken und Werkzeuge
XML (eXtensible Markup Language) bleibt eines der wichtigsten Formate für Datenaustausch, Konfigurationsdateien und Dokumentenverwaltung. Das Rust-Ökosystem bietet mehrere ausgereifte Lösungen für die Arbeit mit XML – vom leistungsstarken Streaming-Parsing bis zur bequemen Serialisierung über serde. In diesem Artikel betrachten wir die drei beliebtesten Werkzeuge: quick-xml, roxmltree und serde-xml-rs.
Warum Rust für die Arbeit mit XML?
Rust vereint die Geschwindigkeit von C/C++ mit Speichersicherheit. Bei der Verarbeitung großer XML-Dateien (z. B. medizinischer Aufzeichnungen oder Geodaten) ist dies entscheidend. Die Bibliotheken für XML in Rust sind von Grund auf in Rust geschrieben (ohne C-Bindungen), was Thread-Sicherheit und vorhersagbare Leistung garantiert.
Bibliotheken für die Arbeit mit XML in Rust
- quick-xml – ein leistungsstarker Streaming-Parser (SAX-Stil) und Writer. Minimaler Speicherverbrauch, ideal für große Dateien.
- roxmltree – ein DOM-Parser, der einen Dokumentbaum erstellt. Praktisch für Navigation und Änderungen.
- serde-xml-rs – Serialisierung/Deserialisierung von Rust-Strukturen in/aus XML über die Crate
serde. Maximale Integration mit dem Typsystem.
Installation
Fügen Sie die Abhängigkeiten in Cargo.toml hinzu:
[dependencies]quick-xml = "0.36" # Streaming-Parserroxmltree = "0.20" # DOM-Parserserde-xml-rs = "0.6" # Serialisierung (zusammen mit serde)serde = { version = "1.0", features = ["derive"] }XML-Parsing mit quick-xml
quick-xml arbeitet im Reader-Modus – es liest nacheinander Tokens (Tag-Öffnung, Text, Tag-Schließung). Das spart Speicher: Sie verarbeiten das Dokument stückweise, ohne es vollständig zu laden.
Beispiel: Lesen eines RSS-Feeds
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 News</title> <item> <title>Rust 1.78 veröffentlicht</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!("Fehler: {}", e), _ => () } buf.clear(); } Ok(())}Ausgabe: Überschriften aller <item>.
DOM-Parsing mit roxmltree
roxmltree lädt das gesamte XML in einen Baum. Dies ist praktisch, wenn Sie wiederholt auf verschiedene Knoten zugreifen oder die Struktur ändern müssen.
Beispiel: Extrahieren von Attributen und Text
use roxmltree::Document;
fn main() { let data = r#" <config version="1.0"> <database> <host>localhost</host> <port>5432</port> </database> </config>"#;