c# - .NET 6 XmlSerializer 漂亮的打印
问题描述
我有这个示例 .NET 6 程序将序列化对象打印到 XML:
using System.Text;
using System.Xml.Serialization;
var serializer = new XmlSerializer(typeof(Order));
var order = new Order
{
Address = new Address
{
FirstName = "Name"
}
};
await using var memoryStream = new MemoryStream();
var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8);
serializer.Serialize(streamWriter, order);
var result = Encoding.UTF8.GetString(memoryStream.ToArray());
Console.WriteLine(result);
public class Order
{
public Address Address;
}
public class Address
{
public string FirstName;
}
这将导致以下输出:
<?xml version="1.0" encoding="utf-8"?><Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Address><FirstName>Name</FirstName></Address></Order>
在 .NET 5 和 .NET Core 3 中,类似的代码会生成如下所示的漂亮打印 XML。如何在 .NET6 中格式化此 XML?
<?xml version="1.0" encoding="utf-8"?>
<Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Address>
<FirstName>Name</FirstName>
</Address>
</Order>
解决方案
要编写缩进的 xml,您可以使用XmlTextWriter
(而不仅仅是StreamWriter
)Formatting
设置为Formatting.Indented
:
await using var memoryStream = new MemoryStream();
XmlTextWriter streamWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
streamWriter.Formatting = Formatting.Indented;
serializer.Serialize(streamWriter, order);
var result = Encoding.UTF8.GetString(memoryStream.ToArray());
UPD
正如@sveinungf在评论中所写 -推荐使用方法XmlWriter.Create
,所以代码看起来像这样(还要注意 create 方法也可以接受和文件名,这在某些情况下会更方便):StringBuilder
await using var memoryStream = new MemoryStream();
var streamWriter = XmlWriter.Create(memoryStream, new()
{
Encoding = Encoding.UTF8,
Indent = true
});
serializer.Serialize(streamWriter, order);
var result = Encoding.UTF8.GetString(memoryStream.ToArray());
推荐阅读
- java - 在一个 Browserstack 会话中打开两个浏览器实例
- r - 结合来自两个不同数据帧的 ggeffect 图和地毯图
- python - discord.py,在没有 on_message() 事件的情况下通过通道 id 发送消息?
- reactjs - 为什么 Google Dev Tools 移动查看器显示的内容与实际移动设备不同?
- node.js - 有没有办法通过nodemailer直接访问SAP SMTP?
- sql - SQLite 如果未达到限制,则从其他表中添加内容
- javascript - 在响应nodeJs之前等待文件上传到firebase
- python - Python plot() 函数
- apache-spark - 如何使用 Spark 加速 S3 上的恢复分区?
- php - 使 Laravel Jetstream 团队能够配置自己的 SSO 登录