使用XmlReader的W8 Phone System.Xml.XmlException

时间:2014-10-26 22:25:52

标签: c# xml windows windows-phone-8 rss

我正在尝试为Windows Phone 8制作RSS应用程序,但每当我尝试使用XmlReader下载RSS内容时都会出现错误。

using System.Xml.Linq;
using System.Net;
using System.ServiceModel.Syndication;

XmlReaderSettings settings = new XmlReaderSettings();
                settings.DtdProcessing = DtdProcessing.Ignore;

                XmlReader reader = XmlReader.Create(http://feeds.bbci.co.uk/news/business/rss.xml, settings);
                SyndicationFeed feed = SyndicationFeed.Load(reader);
                reader.Close();

错误发现在“XmlReader reader = XmlReader.Create ....”行中。完整的错误消息是:

System.Xml.ni.dll中出现'System.Xml.XmlException'类型的第一次机会异常

其他信息:无法打开“http://feeds.bbci.co.uk/news/business/rss.xml”。 Uri参数必须是文件系统相对路径。

感谢您的帮助! :)

1 个答案:

答案 0 :(得分:2)

您收到该错误是因为它希望LocalStorage中的文件不是网址。因此,您必须下载文件并将其转换为:

public MainPage()
{
    // our web downloader
    WebClient downloader = new WebClient();

    // our web address to download, notice the UriKind.Absolute
    Uri uri = new Uri("http://feeds.bbci.co.uk/news/business/rss.xml", UriKind.Absolute);

    // we need to wait for the file to download completely, so lets hook the DownloadComplete Event
    downloader.DownloadStringCompleted += new DownloadStringCompletedEventHandler(FileDownloadComplete);

    // start the download
    downloader.DownloadStringAsync(uri); 
}

// this event will fire if the download was successful
void FileDownloadComplete(object sender, DownloadStringCompletedEventArgs e)
{
    // e.Result will contain the files byte for byte

    // your settings
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.DtdProcessing = DtdProcessing.Ignore;

    // create a memory stream for us to use from the bytes of the downloaded file
    MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(e.Result ?? ""));

    // create your reader from the stream of bytes
    XmlReader reader = XmlReader.Create(ms, settings);

    // do whatever you want with the reader
    // ........

    // close
    reader.Close()
}