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

如何在Rust中使用serde_xml序列化时添加XML prolog声明

解答

可以实现,serde-xml-rs(Rust生态主流的serde XML序列化库)默认不会自动生成XML声明头(prolog),有两种常用方式可以实现你要的效果:

方案1:手动拼接(推荐,写法更简洁)

XML声明头的格式固定,你只需要在序列化得到的XML主体内容前拼接对应字符串即可,示例代码如下:

use serde::Serialize;
use serde_xml_rs::to_string;

#[derive(Serialize)]
struct User {
    name: String,
    last_name: String
}

fn main() {
    let user = User {
        name: "Jimmy".to_string(),
        last_name: "Foobar".to_string()
    };
    // 序列化得到XML主体
    let xml_body = to_string(&user).expect("序列化失败");
    // 拼接声明头
    let output = format!(r#"<?xml version="1.0" encoding="UTF-8"?>
{}"#, xml_body);
    println!("{}", output);
}

方案2:通过Serializer配置自动写入

如果你不想手动拼接,可以直接调用底层Serializer接口,在序列化前先写入声明头事件,示例代码如下:

use serde::Serialize;
use serde_xml_rs::{Serializer, XmlEvent};
use xml::common::XmlVersion;

#[derive(Serialize)]
struct User {
    name: String,
    last_name: String
}

fn main() {
    let user = User {
        name: "Jimmy".to_string(),
        last_name: "Foobar".to_string()
    };
    let mut buf = Vec::new();
    let mut serializer = Serializer::new(&mut buf);
    // 配置2空格缩进,和你示例的格式匹配
    serializer.indent(2, b' ');
    // 写入XML声明头
    serializer
        .write_event(XmlEvent::StartDocument {
            version: XmlVersion::Version10,
            encoding: Some("UTF-8"),
            standalone: None,
        })
        .expect("写入声明头失败");
    // 执行序列化
    user.serialize(&mut serializer).expect("序列化失败");
    let output = String::from_utf8(buf).expect("转字符串失败");
    println!("{}", output);
}

两种方案的输出都和你期望的效果完全一致,普通场景下优先选方案1即可,代码更简洁易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:18:00