Search code examples
c#.netxmlreader

Go back to parent node using XmlReader


I'm looking at the example below, and I wonder, after I'm done reading all the image nodes, how do I get back reading the last_modified_at node from parent element? (See my comments in last few lines of code)

public class StackOverflow_6473251
{
    public static void Test()
    {
        string xml = @"
           <movies>
             <movie>
               <score>8.582207</score>
               <popularity>3</popularity>
               <translated>true</translated>
               <adult>false</adult>
               <language>en</language>
               <original_name>Transformers</original_name>
               <name>Transformers</name>
               <alternative_name>The Transformers</alternative_name>
               <type>movie</type>
               <id>1858</id>
               <imdb_id>tt0418279</imdb_id>
               <url>http://www.themoviedb.org/movie/1858</url>
               <votes>28</votes>
               <rating>7.2</rating>
               <certification>PG-13</certification>
               <overview>The Earth is caught in the middle of an intergalactic war /overview>
               <released>2007-07-04</released>
               <images>
                    <image type=""poster"" url=""http://hwcdn.themoviedb.org/posters/304/4bc91347017a3c57fe007304/transformers-original.jpg"" size=""original"" id=""4bc91347017a3c57fe007304""/>
                    <image type=""poster"" url=""http://hwcdn.themoviedb.org/posters/304/4bc91347017a3c57fe007304/transformers-mid.jpg"" size=""mid"" id=""4bc91347017a3c57fe007304""/>
                    <image type=""poster"" url=""http://hwcdn.themoviedb.org/posters/304/4bc91347017a3c57fe007304/transformers-cover.jpg"" size=""cover"" id=""4bc91347017a3c57fe007304""/>
                    <image type=""poster"" url=""http://hwcdn.themoviedb.org/posters/304/4bc91347017a3c57fe007304/transformers-thumb.jpg"" size=""thumb"" id=""4bc91347017a3c57fe007304""/>
                    <image type=""backdrop"" url=""http://hwcdn.themoviedb.org/backdrops/2ce/4bc91339017a3c57fe0072ce/transformers-original.jpg"" size=""original"" id=""4bc9133s9017a3c57fe0072ce""/>
                    <image type=""backdrop"" url=""http://hwcdn.themoviedb.org/backdrops/2ce/4bc91339017a3c57fe0072ce/transformers-poster.jpg"" size=""poster"" id=""4bc91339017a3c57fe0072ce""/>
                    <image type=""backdrop"" url=""http://hwcdn.themoviedb.org/backdrops/2ce/4bc91339017a3c57fe0072ce/transformers-thumb.jpg"" size=""thumb"" id=""4bc91339017a3c57fe0072ce""/>
               </images>
             <last_modified_at>2010-04-26 03:26:14</last_modified_at>
       </movie>
     </movies>";
        XmlReader r = XmlReader.Create(new StringReader(xml));
        r.ReadToFollowing("original_name");
        string title = r.ReadElementContentAsString("original_name", r.NamespaceURI);
        r.ReadToFollowing("images");
        int imageCount = 0;
        if (r.ReadToDescendant("image"))
        {
            do
            {
                Console.WriteLine("Image {0}", ++imageCount);
                Console.WriteLine("  Type: {0}", r.GetAttribute("type"));
                Console.WriteLine("  URL: {0}", r.GetAttribute("url"));
                Console.WriteLine("  Size: {0}", r.GetAttribute("size"));
                Console.WriteLine("  ID: {0}", r.GetAttribute("id"));
            } while (r.ReadToNextSibling("image"));
        }
        //read last_modified_at
        //reader.Name evaluates to 'images' at execution time
        //reader.NodeType evaluates to 'EndElement' at execution time
    }
}

UPDATE

In a similar scenario, I'm trying to achieve the same result successfully accomplished by the answers below unsuccessfully, and fails at the highlighted line (41) by returning false.
The problem is going from the last abbr to intervals. And here is where I can't see the difference from the example presented above.

Update Here is a complete example.


Solution

  • As last_modified_at follows the images you can do it as you did it some lines up:

    r.ReadToFollowing("last_modified_at");
    string lastModified = r.ReadElementContentAsString("last_modified_at", r.NamespaceURI);