如何在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
相关产品推荐
相关产品推荐

