XmlTextWriter
This type renders XML data to a string
. This string
remains in the memory of the C# program. We use an underlying buffer—in this case, a StringWriter
instance.
This type is useful for in-memory generation of XML. Because it works iteratively, it can provide faster XML generation than other approaches.
First, this program includes the System.Xml
and System.IO
namespaces. These are for the XmlTextWriter
and StringWriter
. The program creates an array of 4 Tuple
instances.
StringWriter
is used as a backing store for the XmlTextWriter
. XmlTextWriter
to the StringWriter
instance you passed to it.WriteStartDocument
and WriteStartElement
methods. These begin the XML document and then begin an element.string
to WriteStartElement
, the XmlTextWriter
then will know the element tag you are writing.foreach
loop that enumerates the array of Tuple
instances. In each iteration, we write an Employee element.using System; using System.IO; using System.Xml; class Program { static void Main() { // Create an array of four Tuples. var array = new Tuple<int, string, string, int>[4]; array[0] = new Tuple<int, string, string, int>(1, "David", "Smith", 10000); array[1] = new Tuple<int, string, string, int>(3, "Mark", "Drinkwater", 30000); array[2] = new Tuple<int, string, string, int>(4, "Norah", "Miller", 20000); array[3] = new Tuple<int, string, string, int>(12, "Cecil", "Walker", 120000); // Use StringWriter as backing for XmlTextWriter. using (StringWriter str = new StringWriter()) using (XmlTextWriter xml = new XmlTextWriter(str)) { // Root. xml.WriteStartDocument(); xml.WriteStartElement("List"); xml.WriteWhitespace("\n"); // Loop over Tuples. foreach (var element in array) { // Write Employee data. xml.WriteStartElement("Employee"); xml.WriteElementString("ID", element.Item1.ToString()); xml.WriteElementString("First", element.Item2); xml.WriteWhitespace("\n "); xml.WriteElementString("Last", element.Item3); xml.WriteElementString("Salary", element.Item4.ToString()); xml.WriteEndElement(); xml.WriteWhitespace("\n"); } // End. xml.WriteEndElement(); xml.WriteEndDocument(); // Result is a string. string result = str.ToString(); Console.WriteLine("Length: {0}", result.Length); Console.WriteLine("Result: {0}", result); } } }Length: 441 Result: <?xml version="1.0" encoding="utf-16"?><List> <Employee><ID>1</ID><First>David</First> <Last>Smith</Last><Salary>10000</Salary></Employee> <Employee><ID>3</ID><First>Mark</First> <Last>Drinkwater</Last><Salary>30000</Salary></Employee> <Employee><ID>4</ID><First>Norah</First> <Last>Miller</Last><Salary>20000</Salary></Employee> <Employee><ID>12</ID><First>Cecil</First> <Last>Walker</Last><Salary>120000</Salary></Employee> </List>
You will notice there are some calls to WriteWhitespace
in the code. These are present to make the output look a bit nicer.
WriteEnd
methods. These match the WriteStartDocument
and WriteEndElement
methods called earlier.After constructing XmlTextWriter
with a backing stream, you must use WriteStartDocument
. All Start methods must be matched by End methods such as WriteEndDocument
.