我已经生成了这个代码来从字符串中读取xml文件,但它有问题。值得注意的是ReadToFollowing()方法什么都不返回。它似乎寻找整个xmlstring,然后将XMLReader状态设置为EndofFile。我很困惑,ReadStartElement()可以工作,下一个元素被读作“你想要的”标题。
这是我的代码,我的想法是通读xml拉出我需要的字段;
List<string> contentfields = new List<string>() { "heading", "shortblurb", "description" };
string xml = @"<filemeta filetype='Audio'><heading>Fatigue & 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();
答案 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 & 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();