13

How do you write an XML file from an System.Xml.XmlReader?

I thought this would be a simple question but whenever I search I seem to be ending up with reading the file to a reader or writing node by node.

The XmlReader object conveys xml that was stored in a database and just needs to come out of the database to a file. Is there any easy way to do this?

        SqlCommand dataCmd = new SqlCommand(sqlText, Conn);
        System.Xml.XmlReader dataReader = null;

        dataCmd.CommandTimeout = 60000;

        Conn.Open();
        dataReader = dataCmd.ExecuteXmlReader();
        dataReader.Read();
redcalx
  • 8,177
  • 4
  • 56
  • 105
Andy
  • 2,248
  • 7
  • 34
  • 57

2 Answers2

27

You need to create an XmlWriter and call its WriteNode method.

For example:

using (conn)
using (SqlCommand dataCmd = new SqlCommand(sqlText, Conn)) {
    dataCmd.CommandTimeout = 60000;

    Conn.Open();
    using (XmlReader dataReader = dataCmd.ExecuteXmlReader())
    using (XmlWriter writer = XmlWriter.Create(File.OpenWrite(...)) {
        writer.WriteNode(dataReader, true);
    }
}
SLaks
  • 868,454
  • 176
  • 1,908
  • 1,964
  • i had one using higher up, but this clean up has made the code even better. thank you. – Andy Oct 21 '10 at 15:36
  • 3
    For the googlers. The file does not get closed if you don't use var settings = new XmlWriterSettings{CloseOutput = true}; XmlWriter.Create(File.OpenWrite(...),settings) – Archlight Aug 29 '13 at 13:59
9

The simplest way would be to pass it into an XmlWriter, using a method such as this:

public void WriteOutXml(XmlReader xmlReader, string fileName)
{
    var writer = XmlWriter.Create(fileName);
    writer.WriteNode(xmlReader, true);
}
Rob Levine
  • 40,328
  • 13
  • 85
  • 111