Arbeit mit XML in Rust: Bibliotheken quick-xml, roxmltree und serde_xml_rs

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: Überblick über die wichtigsten Bibliotheken



XML bleibt ein gefragtes Format für Konfigurationsdateien, den Datenaustausch in älteren Systemen und die Speicherung strukturierter Informationen. Im Rust-Ökosystem gibt es mehrere ausgereifte Bibliotheken für die Arbeit mit XML, die jeweils auf bestimmte Szenarien ausgerichtet sind: von leistungsstarkem Streaming-Parsing bis hin zu bequemer Deserialisierung in streng typisierte Strukturen. In diesem Artikel betrachten wir drei Hauptbibliotheken: quick-xml, roxmltree und serde_xml_rs, und geben praktische Beispiele für deren Verwendung.



Bibliothek quick-xml: schnelles Streaming-Parsing



quick-xml ist eine der schnellsten Bibliotheken für die Arbeit mit XML in Rust. Sie ist für minimalen Overhead und geringen Speicherverbrauch konzipiert. Das grundlegende Arbeitsprinzip ist Streaming-Parsing. Sie lesen XML sequentiell und verarbeiten Ereignisse: öffnende und schließende Tags, Text, Kommentare.



Dieser Ansatz ist ideal für die Verarbeitung großer Dateien (Hunderte von Megabyte), bei denen das DOM-Modell (Laden des gesamten Dokuments in den Speicher) nicht anwendbar ist. Die Bibliothek unterstützt sowohl das Lesen als auch das Schreiben von XML.



Beispiel: Lesen einer Konfiguration mit quick-xml



Angenommen, wir haben eine einfache XML-Datei config.xml:



<config>    <app name="my_app">        <port>8080</port>        <host>localhost</host>    </app></config>


Parsing mit quick-xml und seiner High-Level-API Reader:



use quick_xml::Reader;use quick_xml::events::Event;

fn main() -> Result<(), Box<dyn std::error::Error>> { let xml = r#" <config> <app name="my_app"> <port>8080</port> <host>localhost</host> </app> </config> "#;

let mut reader = Reader::from_str(xml); let mut txt = Vec::new(); let mut in_port = false;

loop { match reader.read_event() { Ok(Event::Start(ref e)) => { if e.name().as_ref() == b"port" { in_port = true; } } Ok(Event::Text(ref e)) => { if in_port { txt.push(e.unescape()?.to_string()); in_port = false; } } Ok(Event::Eof) => break, Err(e) => panic!("Error at position {}: {:?}", reader.buffer_position(), e), _ => () } } println!("Port value: {}", txt[0]); Ok(())}


Wie Sie sehen, ist der Code imperativ und erfordert manuelle Zustandsverwaltung, bietet aber die volle Kontrolle über den Parsing-Prozess.



Bibliothek roxmltree: Arbeit mit dem DOM-Baum



Wenn Sie lieber mit XML als Objektbaum (DOM) arbeiten, ist roxmltree eine ausgezeichnete Wahl. Sie lädt das gesamte Dokument in den Speicher und bietet bequeme Methoden zur Navigation: Suche mit XPath-ähnlichen Abfragen, Durchlaufen von Kindelementen, Abrufen von Attributen.



Die Bibliothek unterstützt keine Serialisierung (Schreiben von XML), aber zum Lesen und Analysieren ist sie sehr praktisch. Ein wichtiger Vorteil ist die strenge Überprüfung von Namespaces.



Beispiel: Suchen von Elementen mit roxmltree



use roxmltree::Document;

fn main() -> Result<(), Box<dyn std::error::Error>> { let xml = r#" <catalog> <book id="1"> <title>Rust in Action</title> <author>Tim McNamara</author> </book> <book id="2"> <title>Programming Rust</title> <author>Jim Blandy</author> </book> </catalog> "#;

let doc = Document::parse(x

Empfehlungen