如何从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中来确认这一点。有更好的方法吗?
为了补充@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
的迭代中,您将尝试使用字段name
和photo
,这些字段仅在您的事件处理程序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);
....