使用linq从xml获取信息

时间:2014-02-19 03:24:11

标签: c# xml wpf linq api

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

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

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:0)

如果您使用 SyndicationFeed ,可能会更好。请参阅以下示例:

导入所需的namspaces

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

加载Feed实现

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