Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.NET 6 XmlSerializer Pretty print

Tags:

c#

.net

.net-6.0

I've this sample .NET 6 program printing out a serialised object to 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;
}

This results in this output:

<?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>

In .NET 5 and .NET Core 3 similar code results in pretty printed XML like below. How can I format this XML in .NET6?

<?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>
like image 901
dhrm Avatar asked Feb 06 '26 22:02

dhrm


1 Answers

To write indented xml you can use XmlTextWriter (instead of just StreamWriter) with Formatting set to 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

As @sveinungf wrote in the comment - using XmlWriter.Create is recommended approach, so the code can look like this (also note that Create method can accept StringBuilder or file name which can be more convenient in some scenarios):

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());
like image 152
Guru Stron Avatar answered Feb 08 '26 12:02

Guru Stron