用脱机XDocument替换WebClient

时间:2011-01-04 04:30:14

标签: c# xml visual-studio-2010 windows-phone-7 webclient

我已经构建了一个完整的Windows Phone 7应用程序(我感到非常自豪!)但我刚刚意识到在我的应用程序中访问的XML文件没有真正的目的在我的网站上托管。由于他们从未真正需要更新,因此我认为仅仅包含作为项目的一部分更有意义。但是,我从中学到的大部分经验和教程都展示了如何在通过WebClient下载XML数据后将其解析为列表框。那么,有一种简单的方法可以用离线XML加载器替换WebClient吗?

这实际上是我的应用程序中有多少页面被编码,显然我为了简单起见,将一些特定于我的应用目的的名称更改为关于人/名字/年龄的废话。

namespace WindowsPhoneApplication14.Pages.Other
{
public partial class People : PhoneApplicationPage
{
    public People()
    {           
        InitializeComponent();

        Dispatcher.BeginInvoke((Action)(() => pplListBox.ItemsSource = ppldata));

        WebClient pplWebClient = new WebClient();

        pplWebClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(ppl_DownloadStringCompleted);
        pplWebClient.DownloadStringAsync(new Uri("http://www.mywebsite.com/ppl.xml"));
    }

    void ppl_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error != null)
            return;

        XElement xmlitem = XElement.Parse(e.Result);

        var ppldata = new List<PeopleClass>();

        foreach (XElement item in xmlitem.Elements("entry"))
        {
            var name = item.Element("name");
            var namevalue = (name == null) ? null : name.Value;
            var age = item.Element("age");
            var agevalue = (age == null) ? null : age.Value;

            ppldata.Add
                (new PeopleClass
                    {
                        Name = namevalue,
                        Age = agevalue,
                    }
                );
        }

        pplListBox.ItemsSource = ppldata;            

    }

    public class PeopleClass
    {
        public string Name { get; set; }
        public string Age { get; set; }
    }

    public System.Collections.IEnumerable ppldata { get; set; }

}

}

那么我可以换掉WebClient操作呢?

1 个答案:

答案 0 :(得分:1)

您会注意到XDocument.Load有两组主要的覆盖。一个接受一个流(就像你在XElement.Parse(e.Result)中使用的那样),另一个接受XAP中XML文件的路径。

如果您的文档是静态的并且可以使用XAP发布,则可以使用后者。

我发布的这个样本就是这样的。

binding a Linq datasource to a listbox