You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用serde-xml-rs序列化时出现LastElementNameNotAvailable错误求助

serde-xml-rs序列化报错LastElementNameNotAvailable的解决方法

在使用serde-xml-rs解析和序列化XML的项目中,XML解析正常,但序列化时抛出LastElementNameNotAvailable错误。相关项目配置、代码及错误输出如下:

Cargo.toml配置

[package]
name = "serde_xml_rs_serialization_error"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = { version = "1.0.164", features = ["derive"] }
serde-xml-rs = "0.6.0"

原代码(src/main.rs)

use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, Deserialize, Serialize)]
struct Types {
    #[serde(rename = "type")]
    types: Vec<Type>,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
struct Type {
    name: String,
}

const XML: &str = r#"<types>
    <type name="first"/>
    <type name="second"/>
</types>"#;

fn main() {
    let types: Types = serde_xml_rs::from_str(XML).expect("Cannot parse XML.");
    dbg!(&types);
    match serde_xml_rs::to_string(&types) {
        Ok(xml) => {
            dbg!(xml);
        }
        Err(error) => {
            dbg!(error);
        }
    };
}

运行错误输出

cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.05s
     Running `target\debug\serde_xml_rs_serialization_error.exe`
[src\main.rs:21] &types = Types {
    types: [
        Type {
            name: "first",
        },
        Type {
            name: "second",
        },
    ],
}
[src\main.rs:27] error = Writer {
    source: LastElementNameNotAvailable,
}

原因分析

报错核心原因是根结构体Types未指定序列化对应的XML根元素名称。解析XML时,输入的XML有明确的根标签<types>,serde-xml-rs能正确映射到Types结构体;但序列化时,库无法自动推断根元素名称,因此抛出LastElementNameNotAvailable错误。

解决方法

给Types结构体添加#[serde(rename = "types")]属性,明确指定其对应的XML根元素名称:

修改后的代码

use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename = "types")] // 新增该行指定根元素名称
struct Types {
    #[serde(rename = "type")]
    types: Vec<Type>,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
struct Type {
    name: String,
}

const XML: &str = r#"<types>
    <type name="first"/>
    <type name="second"/>
</types>"#;

fn main() {
    let types: Types = serde_xml_rs::from_str(XML).expect("Cannot parse XML.");
    dbg!(&types);
    match serde_xml_rs::to_string(&types) {
        Ok(xml) => {
            dbg!(xml);
        }
        Err(error) => {
            dbg!(error);
        }
    };
}

验证结果

修改后运行代码,序列化会成功生成符合预期的XML:

"<types><type name=\"first\"/><type name=\"second\"/></types>"

内容的提问来源于stack exchange,提问作者user3515670

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:43:22