.NET 6 XmlSerializer 漂亮的打印

dhr*_*hrm 12 .net c# .net-6.0

我有这个示例 .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;
}
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

<?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>
Run Code Online (Sandbox Code Playgroud)

在 .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>
Run Code Online (Sandbox Code Playgroud)

Gur*_*ron 20

要编写缩进的 xml,您可以使用XmlTextWriter(而不是仅仅StreamWriterFormatting设置为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());
Run Code Online (Sandbox Code Playgroud)

UPD

正如@sveinungf在评论中所写 - usingXmlWriter.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());
Run Code Online (Sandbox Code Playgroud)

  • 请注意,[不再建议使用]`XmlTextWriter`(https://learn.microsoft.com/en-us/dotnet/api/system.xml.xmltextwriter)。现在建议改用“XmlWriter.Create”。 (2认同)