2010-01-25 2 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

Ahh комментарии .. Не использовать для них, они делают это заблуждение. – corymathews

+0

Вы пытаетесь стать комментатором? –

ответ

11

Вы уже прочитали все данные из ответа при вызове

resXML = readerStream.ReadToEnd(); 

... readerStream и readStream оба слоя сверху receiveStream, поэтому, как только вы прочтете все данные через один, вы не сможете прочитать его снова через другой.

У вас действительно должен быть оператор 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

мои потоки чтения были тем, что сделали. Благодарю. –

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

Как Джон сказал, что вы уже прочитали все данные, так что вы не можете прочитать ее еще раз, однако, вы должны быть в состоянии чтобы установить положение потока обратно к нулю, а затем снова прочитать его.

получаетStream.Position = 0;

Другим советом, который я бы сказал, является переименование переменной «readStream» в «читатель» или что-то еще, потому что это StreamReader, а не Stream.

Заботьтесь, Том

+0

Я не могу сказать, что поиск отключен. Не знаю, почему. –

 Смежные вопросы

  • Нет связанных вопросов^_^