2011-02-18 60 views
1

我已經制作了這個代碼來從字符串中讀取一個xml文件,但它有問題。值得注意的是ReadToFollowing()方法什麼也沒有返回。它似乎尋找整個xmlstring,然後將XMLReader狀態設置爲EndofFile。我非常困惑,ReadStartElement()工作,下一個元素被視爲「標題」,如你所期望的。XmlReader.ReadtoFollowing has state EndofFile爲什麼?

這裏是我的代碼,我的想法是通過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(); 

回答

2

這是因爲reader.ReadStartElement("filemeta");將使讀者對XML標記headingReadToFollowing然後將執行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(); 
+0

`reader.Name`是字符串類型了,沒有必要爲`reader.Name.ToString()` – Somebody 2016-06-15 14:57:24

相關問題