2010-01-25 41 views
1

爲什麼while循環沒有返回任何東西?我認爲這與.NET有關。我有.NET 2.0。問題是while語句會執行一次然後退出,就好像沒有那個名字的節點,當它肯定的時候。這段代碼有什麼問題

這裏是XML的例子:

<rss version="2.0"> 
    <channel> 
     <title>...</title> 
     <link>...</link> 
     <description>...</description> 
     <lastBuildDate>...</lastBuildDate> 
     <item> 
      <title>User greeting</title> 
      <guid>...</guid> 
      <link>http://...</link> 

      <description>Voicebox number: 1</description> 
      <author>Free Conference Call</author> 
     </item> 
     <item> 
      <title>User greeting</title> 
      <guid>...</guid> 
      <link>http://...</link> 

      <description>Voicebox number: 1</description> 
      <author>Free Conference Call</author> 
     </item> 
    </channel> 
</rss> 

下面是代碼:

HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create (reqURL); 
// Set some reasonable limits on resources used by this request 
webreq.MaximumAutomaticRedirections = 4; 
webreq.MaximumResponseHeadersLength = 4; 
//==================== 
// Set credentials to use for this request. 
webreq.Credentials = CredentialCache.DefaultCredentials; 
HttpWebResponse response = (HttpWebResponse)webreq.GetResponse(); 
//==================== 
// Get the stream associated with the response. 
receiveStream = response.GetResponseStream(); 
//==================== 
// Pipes the stream to a higher level stream reader with the required encoding format. 
readStream = new StreamReader(receiveStream, Encoding.UTF8); 
resXML = readStream.ReadToEnd(); 
readStream = new StreamReader(receiveStream, Encoding.UTF8); 
//==================== 
Console.WriteLine(resXML); 
Stream XMLStream = receiveStream; 
readStream = new StreamReader(XMLStream, Encoding.UTF8); 

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ConformanceLevel = ConformanceLevel.Fragment; 
settings.IgnoreWhitespace = true; 
settings.IgnoreComments = true; 
XmlReader reader = System.Xml.XmlReader.Create(readStream, settings); 

while(reader.EOF == false) 
{ 
    reader.ReadToFollowing("link"); 
    Console.WriteLine("link: " + reader.Value); 
    //======================================= 
    reader.ReadToFollowing("description"); 
    Console.WriteLine("descrip: " + reader.Value); 
} 
+0

啊..意見不使用這些,他們讓混亂。 – corymathews 2010-01-25 14:52:30

+0

你想成爲評論員嗎? – 2010-02-12 19:06:37

回答

11

您已經閱讀當你調用響應所有的數據

resXML = readerStream.ReadToEnd(); 

... readerStreamreadStream都分層在之上3210,所以一旦你通過一個閱讀所有的數據,你不能通過其他閱讀。

你應該真的有一個using聲明的響應 - 理想情況下涉及的各種流。既然你可以從流創建XmlReader,而不僅僅是一個StreamReader,爲什麼不使用這樣的事情:

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ConformanceLevel = ConformanceLevel.Fragment; 
settings.IgnoreWhitespace = true; 
settings.IgnoreComments = true; 

using (HttpWebResponse response = (HttpWebResponse)webreq.GetResponse()) 
{ 
    using (Stream stream = response.GetResponseStream()) 
    { 
     using(XmlReader reader = XmlReader.Create(stream, settings)) 
     { 
      // Do stuff here 
     } 
    } 
} 

此外,我一般推薦創建一個類似XmlDocument或某事,而不是工作XmlReader - 對於大型文檔,它不能很好地擴展,但使用起來更容易。

+0

我的閱讀流是什麼。謝謝。 – 2010-01-25 15:24:41

1

你爲什麼不使用Linq-to-XML?以期更可讀/可維護的代碼

XElement rssFile = XElement.Load(content); 
IEnumerable<XElement> channels = rssFile.Descendants("channel"); 
foreach(XElement channel in channels) 
{ 
    Console.WriteLine("link: " + channel.Element("link").Value); 
    Console.WriteLine("description: " + channel.Element("description").Value); 
} 

除此之外,什麼喬恩說

0

像喬恩說,您已經閱讀所有的數據,所以你不能看了一遍,但是,你應該能夠將流的位置設置回零,然後再次讀取。

receiveStream.Position = 0;

我想說的另一個提示是將變量「readStream」重命名爲「reader」或其他內容,因爲它是StreamReader而不是Stream。

保重, 湯姆

+0

我不能,它說尋求被禁用。不知道爲什麼。 – 2010-01-25 15:26:24