After my TLC session on XML Tools in Visual Studio a gentleman came up to me and asked me a question. He said that he deals with XML coming over the pipe and their usually isn’t an end-of-file character at the end of his email document. He was trying to figure out how he can create a DOM over the valid XML. He was using one reader to do this. I knew that he could use the subtree reader but I didn’t have any code handy to give him. So I played around a bit and here is what I came up with:


public void TestSubTreeReader()


    XmlReaderSettings readerSettings = new XmlReaderSettings();

    readerSettings.ConformanceLevel =ConformanceLevel.Document;


    // this is the XML being used:


      <?xml version="1.0" encoding="utf-8" ?>


          <a> </a>

          <b attribute="adkj">

            text 1

            <c> text 2 </c>


          <d> text 3</d>





    string srcfile = @"sample.xml";

    XmlReader xReader =

      XmlReader.Create(srcfile, readerSettings);


    while (xReader.Read())


        if (xReader.Name == "root")


            XmlReader subTreeReader = xReader.ReadSubtree();

            XmlDocument doc = new XmlDocument();







I approximated his scenario by using an XML file with two elements at the root level (which as we all know is not well-formed). I wanted to make sure that I create a DOM only on top of the “root” element.


In the while loop above I read the XML Declaration and eat it (I can see you wanting to use it for something interesting, but in my scenario, I do nothing with it). I then check to see if my reader is on the “root” node, if it is I create a new reader that is going to start at my root node and then read until it reaches the end root node.


I was worried that the subtree reader would not return the initial root node and would eat the end root node, but it doesn’t. The ReadSubtree() method returns a reader over the current node and all of it’s descendants.


So, there it is, I hope it helps.


Basking in the sun (or will be right after I post this) in beautiful Boston

Neetu Rajpal