【问题标题】:XmlReader.ReadtoFollowing has state EndofFile why?XmlReader.ReadtoFollowing 有状态 EndofFile 为什么?
【发布时间】:2016-06-16 14:12:46
【问题描述】:

我已经生成了这段代码来从字符串中读取 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();

【问题讨论】:

    标签: xmlreader


    【解决方案1】:

    这是因为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();
    

    【讨论】:

    • reader.Name 已经是字符串类型,不需要reader.Name.ToString()
    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 2021-03-20
    • 1970-01-01
    • 2014-06-19
    • 2020-08-25
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多