如何从Windows Phone中的多个XML文件中获取数据?

本文关键字:XML 文件 获取 数据 Windows Phone | 更新日期: 2023-09-27 18:16:24

我的手机中存储了一个初始XML文件,可以访问它来选择一些元素。每个元素都有一个相应的在线XML文件,我需要访问该文件以获取更多信息。

string name, photo;
foreach (int num in combi)
{
    no = xElem.Descendants("employee").ElementAt(num).Descendants("no").First().Value;
    WebClient wc = new WebClient();
    wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler
        (Info_DownloadStringCompleted);
    wc.DownloadStringAsync(new Uri
        ("http://example.com/" + name));
    list.Add(new Person(no, name, photo);    
}
void Info_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    if (e.Error != null) return;
    XElement xml = XElement.Parse(e.Result);
    name = xml.Element("name").Value;
    photo = xml.Element("photo").Value;
}

然而,似乎列表。在下载XML之前先执行Add操作,结果生成一个包含名称和照片空值的列表。我通过将MessageBox放置在foreach循环和Info_DownloadStringCompleted中来确认这一点。有更好的方法吗?

如何从Windows Phone中的多个XML文件中获取数据?

为了补充@MikkoVitala的答案,您最好将ObservableCollection用于list

ObservableCollection有内置的机制,通知UI刷新每当项目添加到或从集合中删除。因此,当您将list绑定到ListBox时,ListBox将始终显示list的最新成员:

string name, photo;
ObservableCollection<Person> list = new ObservableCollection<Person>();
foreach (int num in combi)
{
    .....
}
MyListBox.ItemsSource = list;

您的解决方案的问题是,在您的combi的迭代中,您将尝试使用字段namephoto,这些字段仅在您的事件处理程序Info_DownloadStringCompleted中分配。

既然DownloadStringAsync是,嗯…异步时,您将在DownloadStringCompleted事件引发之前退出foreach,您的事件处理程序被调用,最终您的字段被分配给。

您可以通过将list-add-logic移动到事件引发后执行来纠正这个问题。

....
wc.DownloadStringCompleted += (sender, args) =>
    {
        // Code from your Info_DownloadStringCompleted event handler
        if (args.Error != null) 
            return;
        XElement xml = XElement.Parse(args.Result);
        name = xml.Element("name").Value;
        photo = xml.Element("photo").Value;
        // Now your fields are assigned and you can do-what-ever-with-'em
        list.Add(new Person(no, name, photo);
    };
....

如果你喜欢,你可以使用扩展方法来利用async/await关键字,使其更简单,更容易阅读和理解。见下文https://stackoverflow.com/a/13174270/1061668

然后上面变成(记住标记方法async)

....
// Note that exception is not handled in this example....
xml = await wc.DownloadStringTask(new Uri("http://example.com/" + name));
name = xml.Element("name").Value;
photo = xml.Element("photo").Value;
list.Add(new Person(no, name, photo);
....