Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq从xml获取信息_C#_Xml_Wpf_Linq_Api - Fatal编程技术网

C# 使用linq从xml获取信息

C# 使用linq从xml获取信息,c#,xml,wpf,linq,api,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 Du

在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中获取信息


您的基本代码实际上运行良好。您没有发布GetThumbnailUrlFromLink和GetDuration的代码,但我怀疑您在名称空间方面遇到了问题。有关使用名称空间的示例,请参见

基本上,如果您添加:

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")
如果你使用SyndicationFeed可能会更好。请参见下面的示例:

导入所需的空间

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

您的问题中有很多不必要的数据。发布XML文档,而不是链接到它,查询和预期结果/当前代码有什么问题。谢谢您的评论。我不太擅长这个网站。。当我编写xml文档时,这个编辑器将xml转换为零。无论如何,我会记住你的一般评论!谢谢你:很好,这很有帮助。