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);
}
4

3 回答 3

11

当您调用时,您已经从响应中读取了所有数据

resXML = readerStream.ReadToEnd();

...readerStream并且readStream都位于 之上receiveStream,因此一旦您通过一个读取了所有数据,就无法再次通过另一个读取它。

您真的应该using对响应有一个声明 - 理想情况下是涉及的各种流。鉴于您可以XmlReader从流中创建 a ,而不仅仅是 a 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它——它不能很好地用于大型文档,但它更容易使用。

于 2010-01-25T14:24:41.870 回答
1

why don't you use Linq-to-XML? Would make for more readable/maintainable code

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);
}

other than that, what Jon said

于 2010-01-25T14:30:50.460 回答
0

就像乔恩说的那样,您已经读取了所有数据,因此您无法再次读取它,但是,您应该能够将流的位置设置回零,然后再次读取它。

接收流.Position = 0;

我要说的另一个技巧是将变量“readStream”重命名为“reader”或其他名称,因为它是 StreamReader 而不是 Stream。

保重,汤姆

于 2010-01-25T14:44:54.233 回答