XmlReader.ReadtoFollowing有状态EndofFile为什么?

时间:2011-02-18 12:30:53

标签: xmlreader

我已经生成了这个代码来从字符串中读取xml文件,但它有问题。值得注意的是ReadToFollowing()方法什么都不返回。它似乎寻找整个xmlstring,然后将XMLReader状态设置为EndofFile。我很困惑,ReadStartElement()可以工作,下一个元素被读作“你想要的”标题。

这是我的代码,我的想法是通读xml拉出我需要的字段;

List<string> contentfields = new List<string>() { "heading", "shortblurb", "description" };

string xml = @"<filemeta filetype='Audio'><heading>Fatigue &amp; Tiredness</heading><shortblurb>shortblurb</shortblurb><description /><Comments /><AlbumTitle /><TrackNumber /><ArtistName /><Year /><Genre /><TrackTitle /></filemeta>";

using (XmlReader reader = XmlReader.Create(new StringReader(xml)))
{
    reader.ReadStartElement("filemeta");

    foreach (String field_str in contentfields)
    {
        reader.ReadToFollowing(field_str);

        if (reader.Name.ToString() == field_str)
        {
            Console.WriteLine(field_str + " " + reader.ReadElementContentAsString());
        }
    }
}

Console.ReadKey();

1 个答案:

答案 0 :(得分:2)

这是因为reader.ReadStartElement("filemeta");会将读者置于xml标记heading上。 然后ReadToFollowing将执行1次读取(读取您的heading标记),然后开始寻找名称标题的元素。正如您刚读过的那样,ReadToFollowing将不再找到它并读到文件的末尾。

如果您想避免这种情况,请更改以下代码:

List<string> contentfields = new List<string>() { "heading", "shortblurb", "description" };

string xml = @"<filemeta filetype='Audio'><heading>Fatigue &amp; Tiredness</heading><shortblurb>shortblurb</shortblurb><description /><Comments /><AlbumTitle /><TrackNumber /><ArtistName /><Year /><Genre /><TrackTitle /></filemeta>";

using (XmlReader reader = XmlReader.Create(new StringReader(xml)))
{
    reader.ReadStartElement("filemeta");

    foreach (String field_str in contentfields)
    {
        if (reader.Name.ToString() != field_str)
        {
            reader.ReadToFollowing(field_str);
        }
         //still keep this if because we could have reached the end of the xml document
        if (reader.Name == field_str)
        {
            Console.WriteLine(field_str + " " + reader.ReadElementContentAsString());
        }
    }
}

Console.ReadKey();