C# 使用linq从xml获取信息
在c wpf应用程序中使用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
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转换为零。无论如何,我会记住你的一般评论!谢谢你:很好,这很有帮助。