17 unstable releases (7 breaking)

0.8.2 Nov 14, 2025
0.8.1 Jun 1, 2025
0.8.0 May 3, 2025
0.6.0 Aug 31, 2022
0.1.2 Mar 20, 2017

#12 in #serializer-deserializer

Download history 100210/week @ 2026-03-03 599018/week @ 2026-03-10 430283/week @ 2026-03-17 340083/week @ 2026-03-24 303988/week @ 2026-03-31 324409/week @ 2026-04-07 326972/week @ 2026-04-14 324079/week @ 2026-04-21 337167/week @ 2026-04-28 333294/week @ 2026-05-05 342667/week @ 2026-05-12 337398/week @ 2026-05-19 357987/week @ 2026-05-26 345271/week @ 2026-06-02

1,436,235 downloads per month
Used in 1,098 crates (365 directly)

MIT license

155KB
4.5K SLoC

serde-xml-rs

Rust

xml-rs based serializer and deserializer for Serde (compatible with 1.0)

Example usage

use serde::{Deserialize, Serialize};
use serde_xml_rs::{from_str, to_string};

#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct Item {
    name: String,
    source: String,
}

fn main() {
    let src = r#"<?xml version="1.0" encoding="UTF-8"?><Item><name>Banana</name><source>Store</source></Item>"#;
    let should_be = Item {
        name: "Banana".to_string(),
        source: "Store".to_string(),
    };

    let item: Item = from_str(src).unwrap();
    assert_eq!(item, should_be);

    let reserialized_item = to_string(&item).unwrap();
    assert_eq!(src, reserialized_item);
}

Breaking changes in version 0.8.0

Notably:

  • The $value name has been changed to #content (could become configurable in the future).
  • Fields that are deserialized from attributes must now have a name that starts with a @. This aligns with what was introduced in the serializer.

See MIGRATION.md for more details, and tips on how to migrate.

Dependencies

~0.3–0.9MB
~19K SLoC