Search code examples
c#asynchronousasync-awaitxelementxmlwriter

Saving XElement asynchronously


I am currently writing an XML Tree (XElement) to a file synchronously using XmlWriter, specifically via XElement.WriteTo(XmlWriter) on the root element. I'm trying to make that asynchronous (with an await). XmlWriter can be made asynchronous (XmlWriterSettings.Async = true), and has an async version for many of its methods. However, it doesn't have methods to write an XElement (async or not), and there is no async version of XElement.WriteTo(XmlWriter).

What API can be used to write an XElement to a file asynchronously?


Solution

  • XmlWriter has a method XmlWriter.WriteNodeAsync(XmlReader, Boolean) to which you can pass the XmlReader returned by XNode.CreateReader() e.g. like so:

    public static class XElementExtensions
    {
        public static async Task WriteToAsync(this XContainer element, Stream stream, bool defAttr = true, bool indent = false)
        {
            var settings = new XmlWriterSettings
            {
                Async = true,
                CloseOutput = false,
                Indent = indent,
            };          
    
            using (var writer = XmlWriter.Create(stream, settings))
            using (var reader = element.CreateReader())
            {
                await writer.WriteNodeAsync(reader, defAttr);
            }
        }
    }
    

    Then if you have some Stream stream you could write to it as follows:

    await element.WriteToAsync(stream, false, true);
    

    Sample .Net fiddle.