1

whileループが何も返さないのはなぜですか?これは.NETと関係があると思います。私は.NET2.0を持っています。問題は、whileステートメントが1回実行されてから終了することです。これは、その名前のノードが存在しない場合と同様に、存在する場合と同じです。

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

...readerStreamreadStreamは両方とも上に階層化されている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ます。大きなドキュメントの場合は拡張性がありませんが、作業は簡単です。

于 2010-01-25T14:24:41.870 に答える
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);
}

それ以外は、ジョンが言ったこと

于 2010-01-25T14:30:50.460 に答える
0

Jonが言ったように、すでにすべてのデータを読み取ったので、再度読み取ることはできません。ただし、ストリームの位置をゼロに戻してから、再度読み取ることができるはずです。

receiveStream.Position = 0;

もう1つのヒントは、変数「readStream」の名前を「reader」などに変更することです。これは、StreamではなくStreamReaderであるためです。

気をつけて、トム

于 2010-01-25T14:44:54.233 に答える