Search code examples
.netxmldocumentxmlwriter

How to create a XmlDocument using XmlWriter in .NET?


Many .NET functions use XmlWriter to output/generate xml. Outputting to a file/string/memory is a very operation:

XmlWriter xw = XmlWriter.Create(PutYourStreamFileWriterEtcHere);
xw.WriteStartElement("root");
...

Sometimes , you need to manipulate the resulting Xml and would therefore like to load it into a XmlDocument or might need an XmlDocument for some other reason but you must generate the XML using an XmlWriter. For example, if you call a function in a 3rd party library that outputs to a XmlWriter only.

One of the things you can do is write the xml to a string and then load it into your XmlDocument:

StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
/* write away */
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(S.ToString());

However this is inefficient - first you serialize all the xml info into a string, then you parse the string again to create the DOM.

How can you point an XmlWriter to build a XmlDocument directly?


Solution

  • Here's at least one solution:

    XmlDocument doc = new XmlDocument(); 
    using (XmlWriter writer = doc.CreateNavigator().AppendChild()) 
    { 
        // Do this directly 
         writer.WriteStartDocument(); 
         writer.WriteStartElement("root"); 
         writer.WriteElementString("foo", "bar"); 
         writer.WriteEndElement(); 
         writer.WriteEndDocument();
        // or anything else you want to with writer, like calling functions etc.
    }
    

    Apparently XpathNavigator gives you a XmlWriter when you call AppendChild()

    Credits go to Martin Honnen on : http://groups.google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli=1