Arbeit mit XML in Rust: Parsen, Erstellen und Serialisieren von Daten

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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>"#;

Empfehlungen