我在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中获取信息
答案 0 :(得分:0)
您的基本代码实际上工作正常。您没有发布GetThumbnailUrlFromLink
和GetDuration
的代码,但我怀疑您遇到了名称空间问题。有关使用命名空间的示例,请参阅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