【问题标题】:Load an XML file from a website into XDocument (Silverlight and Windows Phone 7)将 XML 文件从网站加载到 XDocument(Silverlight 和 Windows Phone 7)
【发布时间】:2010-10-23 07:40:41
【问题描述】:

我有一个要在 Windows Phone 7 和 Silverlight 应用程序中访问的 XML 文件。 XML 文件在网络服务器上,我想通过http://www.mydomain.com/data/this_is_my_file.xml 访问它。

如何使用此 URL 将 XML 文件加载到 XDocument 中?

【问题讨论】:

    标签: xml silverlight windows-phone-7 linq-to-xml


    【解决方案1】:

    您可以使用WebClientHttpWebRequest 下载(异步)并解析响应。下面是从 Web 下载和解析 XML 的最简单方法之一 -

    public void LoadXmlItems(string xmlUrl)
    {
       WebClient client = new WebClient();
       
       client.OpenReadCompleted += (sender, e) =>
       {
            if (e.Error != null)
                return;
    
            Stream str = e.Result;
            XDocument xdoc = XDocument.Load(str);
    
            // take 10 first results
            List<RssFeedItem> rssFeedItems = (from item in xdoc.Descendants("item")
                                                select new XmlItem()
                                                {
                                                    Title = item.Element("title").Value,
                                                    Description = item.Element("description").Value,
                                                    Url = new Uri(item.Element("link").Value, UriKind.Absolute)
                                                }).ToList();
            // close
            str.Close();
    
            // add results to the list
            XmlItems.Clear();
            foreach (RssFeedItem item in rssFeedItems)
            {
               XmlItems.Add(item);
            }
        };
        client.OpenReadAsync(new Uri(xmlUrl, UriKind.Absolute));
    }
    

    xmlUrl 是 Web 上 XML 文件的路径。 XmlItem 就是这样一个类-

    public class XmlItem
    {
      public string Title { get; set; }
      public string Description { get; set; }
      public Uri Url { get; set; }
    }
    

    您需要注意,如果您正在更新可观察集合,您可能会遇到跨线程异常。在上面的示例中,XmlItems 是一个List&lt;XmlItem&gt;。但是,如果您希望将 XMLItem 添加到可观察集合中,请改用这段代码 -

    Dispatcher.BeginInvoke(() =>
    {
      XmlItems.Clear();
      foreach (RssFeedItem item in rssFeedItems)
      {
         XmlItems.Add(item);
      }
    });
    

    另一种方法是使用HttpWebRequest。您可以read about this approach here 并使用示例中的代码。

    HTH,indyfromoz

    【讨论】:

    • 嗨 Filip,Indy 的演示代码看起来不错。如果您的下载非常简单,我会倾向于使用 HttpWebRequest 而不是 WebClient,以避免对您的 UI 性能产生负面影响。如果您的下载直接更新 UI,您可以使用如上所示的调度程序来解决跨线程访问问题,或者先将数据拉入非 UI 容器,然后通过调度程序将其加载到您的 ViewModel 或其他 UI 绑定容器,或者回到 UI 线程。
    • @MickN - 试图理解你的评论.....那么,你认为我在回答中遗漏了什么?
    • 不,这是个好主意,因此添加到您的帖子而不是单独编写,只是一些额外的信息供菲利普考虑。 Filip 的重要性取决于他的用途。
    • 很高兴听到,希望我的回答对你有所帮助
    猜你喜欢
    • 2011-10-19
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多