使用XmlReader返回父节点

本文关键字:父节点 返回 XmlReader 使用 | 更新日期: 2023-09-27 18:26:04

我正在看下面的例子,我想知道,在读取完所有image节点后,如何从父元素中重新读取last_modified_at节点?(请参阅我在最后几行代码中的评论)

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
    }
}

更新

在类似的场景中,我试图通过下面的答案成功地获得相同的结果,但没有成功,并且在突出显示的行(41)处返回false失败
问题是从最后一个abbrintervals。这里是我看不出与上面的例子有什么不同的地方。

更新下面是一个完整的例子。

使用XmlReader返回父节点

当last_modified_at跟随图像时,您可以按顺序执行:

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

你不能。来自文件:

表示提供对XML数据的快速、无缓存、仅向前访问的读取器。

你可以从头读一遍。

或者,由于数据非常小,您可以使用XmlDocument,它允许更大的灵活性。

在您的pastebin示例中,而不是if (reader.Name != "abbreviations") do:

if (!reader.ReadToFollowing("abbreviations"))

它失败了,因为你还没有在缩写标签上。

问题中对应的工作代码是:

r.ReadToFollowing("images");

实际上没有reader.Name !=测试。