2010-10-23 93 views

回答

11

您可以使用WebClientHttpWebRequest來下載(異步)並解析響應。一,下載並解析網頁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的路徑是在網絡上的XML文件。 XmlItem是一類像這樣 -

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

您需要注意的是,你可能會遇到跨線程的異常,如果你正在更新一個觀察的集合。在上面的例子中,XmlItems是List<XmlItem>。但是,如果您希望將XMLItem的添加到一個觀察的集合,使用這段代碼,而不是 -

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

的另一種方法是使用HttpWebRequest。您可以使用read about this approach here並使用示例中的代碼。

HTH,indyfromoz

+0

嗨菲利普,Indy的演示代碼看起來不錯。我傾向於使用HttpWebRequest而不是WebClient,如果您的下載不是微不足道的,以避免對您的UI性能產生負面影響。如果您的下載直接更新UI,您可以使用上面所示的調度程序來解決跨線程訪問問題,或者先將數據下拉到非UI容器中,然後通過調度程序將其加載到ViewModel或其他UI綁定容器中,或者回到UI線程上。 – 2010-10-23 12:47:21

+0

@MickN - 試着理解你的評論.....所以,你認爲我錯過了我的答案? – indyfromoz 2010-10-23 18:46:57

+0

Nah,這是個不錯的萌芽,因此可以添加到您的文章中,而不是單獨編寫,只是Filip需要考慮的一些額外信息。 Filip的重要程度取決於他使用的是什麼。 – 2010-10-24 00:35:07