1

私は何年も xmlDataReader を使用して RSS を読んでいますが、使用している 2 つのフィードで突然余分な行が導入され、xmlDataReader パーサーが機能しなくなりました。

問題は、ここの 2 行目が最初の行と競合していることです。

<link>http://www.eventjobsearch.co.uk/jobsrss/</link>
<atom:link href="http://www.eventjobsearch.co.uk/jobsrss/" rel="self" type="application/rss+xml"/>

パーサーは、atom:link 要素が link 要素の複製であると考えます。個人的には atom:link 行は必要ありませんが、ストリームを使用しているため、この行を削除したり、コロンを削除したりする方法がわかりません (これで問題が解決します)。

ストリーム内のコロンを削除して、組み込みのパーサーが再び機能するようにするにはどうすればよいですか?

 HttpWebRequest req = (HttpWebRequest)WebRequest.Create(WebConfigurationManager.AppSettings["XmlJobsFeedUrl"]);
 req.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)"; 

 WebResponse response = req.GetResponse();
 Stream stream = response.GetResponseStream();
 XmlTextReader xmlTextReader = new XmlTextReader(stream);
 DataSet jobs = new DataSet("Jobs");
 jobs.ReadXml(xmlTextReader);
4

2 に答える 2

1

この質問解決策を参照してください。を呼び出す直前にjobs.ReadXml(...)、スキーマを読み取ることができます。

jobs.ReadXmlSchema("http://www.thearchitect.co.uk/schemas/rss-2_0.xsd");

xsd ファイルを自分のサーバーにコピーすることをお勧めします。

于 2013-03-28T13:00:58.780 に答える
1

おそらくこれができると思います:

Stream stream = response.GetResponseStream();
Stream cleanStream = new Stream();

using (StreamWriter writer = new StreamWriter(cleanStream))
{
    using (StreamReader reader = new StreamReader(stream))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            // if the line doesn't match the problem then write it to the stream like this
            writer.WriteLine(line);
        }
    }
}

// and now use the cleanStream instead
XmlTextReader xmlTextReader = new XmlTextReader(cleanStream);

これにより、受信したストリームをきれいにすることができます。

于 2013-03-28T13:04:51.670 に答える