2014-02-19 68 views
0

我在使用linq在c#wpf应用程序中从XML获取信息时遇到了麻烦。 以下是我使用的代码。从xml使用LINQ获取信息

public class YouTubeInfo 
{ 
    public string LinkUrl { get; set; } 
    public string EmbedUrl { get; set; } 
    public string ThumbNailUrl { get; set; } 
    public string Title { get; set; } 
    public int Duration { get; set; } 
} 

public class YouTubeProvider 
{ 
    const string SEARCH = "http://gdata.youtube.com/feeds/api/videos?q={0}&alt=rss&start-index={1}&max-results={2}&v=1"; 
    const string Most_popular = "http://gdata.youtube.com/feeds/api/standardfeeds/KR/most_popular?time=today&alt=rss&start-index={1}&max-results={2}&v=2"; 
    //const string Entertainment = "https://gdata.youtube.com/feeds/api/standardfeeds/KR/most_popular_Entertainment?start-index=1&max-results=2"; 

    #region Load Videos From Feed 
    public static int search_based; 
    static string search; 


    public static List<YouTubeInfo> LoadVideosKey(string keyWord, int start, int limit) 
    { 
     try 
     { 
      switch (search_based) 
      { 
       case 0: search = SEARCH; break; 
       case 1: search = Most_popular; break; 
      } 
      var xraw = XElement.Load(string.Format(search, keyWord, start, limit)); 
      var xroot = XElement.Parse(xraw.ToString()); 
      var links = (from item in xroot.Element("channel").Descendants("item") 
         select new YouTubeInfo 
         { 
          LinkUrl = item.Element("link").Value, 
          Title = item.Element("title").Value, 
          EmbedUrl = GetEmbedUrlFromLink(item.Element("link").Value), 
          ThumbNailUrl = GetThumbNailUrlFromLink(item), 
          Duration = GetDuration(item), 
         }).Take(limit); 

      return links.ToList<YouTubeInfo>(); 
     } 
     catch (Exception e) 
     { 
      Trace.WriteLine(e.Message, "ERROR"); 
     } 
     return null; 
    } 

我想从这个XML

https://gdata.youtube.com/feeds/api/standardfeeds/KR/most_popular_Entertainment?start-index=1&max-results=2

+1

有一个在你的问题很多不必要的数据。发布XML(文档,不链接到它),查询和预期结果/您当前的代码有什么问题。 – MarcinJuraszek

回答

0

也许更好,如果你使用SyndicationFeed。请参见下面的示例:

导入需要namspaces

using System.ServiceModel.Syndication; 
using System.Xml; 

载入供稿实施

private static string GetAttributeFromGroup(SyndicationElementExtensionCollection seec, string elementName, string attributeName) 
{ 
    foreach (SyndicationElementExtension extension in seec) 
    { 
     XElement element = extension.GetObject<XElement>(); 
     if (element.Name.LocalName == "group") 
     { 
      foreach (var item in element.Elements()) 
      { 
       if (item.Name.LocalName == elementName) 
       { 
        return item.Attribute(attributeName).Value; 
       } 
      } 
     } 
    } 
    return null; 
} 

public static List<YouTubeInfo> LoadVideosKey(string keyWord, int start, int limit) 
{ 
    try 
    { 
     switch (search_based) 
     { 
      case 0: search = SEARCH; break; 
      case 1: search = Most_popular; break; 
     } 
     var xDoc = XmlReader.Create(string.Format(search, keyWord, start, limit)); 
     SyndicationFeed feed = SyndicationFeed.Load(xDoc); 
     var links = (from item in feed.Items 
        select new YouTubeInfo 
        { 
         LinkUrl = item.Id, 
         Title = item.Title.Text, 
         EmbedUrl = item.Links.FirstOrDefault().Uri.AbsoluteUri, 
         ThumbNailUrl = GetAttributeFromGroup(item.ElementExtensions, "thumbnail", "url"), 
         Duration = int.Parse(GetAttributeFromGroup(item.ElementExtensions, "duration", "seconds") ?? "0"), 
        }).Take(limit); 

     return links.ToList<YouTubeInfo>(); 
    } 
    catch (Exception e) 
    { 
     Trace.WriteLine(e.Message, "ERROR"); 
    } 
    return null; 
} 

您可以了解更多关于SyndicationFeed here

+0

你是一个真正的.. !!谢谢 – kimtk

+0

谢谢:)很好,它帮助。 – Alice

0

你的基本代码实际上工作正常获取信息。您没有发布GetThumbnailUrlFromLinkGetDuration的代码,但我怀疑您在命名空间中遇到问题。有关使用名称空间的示例,请参阅this answer

事实上,如果你说:

static XNamespace nsMedia = "http://search.yahoo.com/mrss/"; 
static XNamespace nsYt = "http://gdata.youtube.com/schemas/2007"; 

那么你的持续时间可能看起来像:

Duration = (int)item.Element(nsMedia + "group").Element(nsYt + "duration").Attribute("seconds") 
+0

感谢您的意见。我不是很擅长这个网站..当我编写xml文档时,这个编辑器将xml转换为无。无论如何,我会记住你的一般评论! – kimtk