2009-08-03 69 views
2

我试图解析来自YouTube API的结果。我以字符串的形式正确地获取结果,但无法正确解析它。使用LINQ to XML在多个命名空间中处理XML

我在前面的主题上遵循了建议,但没有得到任何结果。

我的示例代码:

string response = youtubeService.GetSearchResults(search.Term, "published", 1, 50); 
XDocument xDoc = XDocument.Parse(response, LoadOptions.SetLineInfo); 
var list = xDoc.Descendants("entry").ToList(); 
var entries = from entry in xDoc.Descendants("entry") 
       select new 
       { 
        Id = entry.Element("id").Value, 
        Categories = entry.Elements("category").Select(c => c.Value) 
        //Published = entry.Element("published").Value, 
        //Title = entry.Element("title").Value, 
        //AuthorName = entry.Element("author").Element("name").Value, 
        //Thumnail = entry.Element("media:group").Elements("media:thumnail").ToList().ElementAt(0) 
       }; 
foreach (var entry in entries) 
{ 
    // entry.Id and entry.Categories available here 
} 

的问题是,项目具有计数0即使的XDocument显然具有有效值。

响应变量(示例XML)的值,可以在这里看到:http://snipt.org/lWm

(FYI:YouTube的模式是列在这里:http://code.google.com/apis/youtube/2.0/developers_guide_protocol_understanding_video_feeds.html

谁能告诉我,我做错了什么这里?

+0

你的第一个问题是没有发布一个失败的例子XML。由于你的第一个问题,我不知道你的第二个问题是什么。 – 2009-08-03 22:17:28

+0

也许你的第二个问题是你没有在foreach循环中设置断点?你尝试过了,还是依赖于调试器? – 2009-08-03 22:19:01

回答

7

所有的数据都在“http://www.w3.org/2005/Atom”命名空间中;你需要在整个使用:

XNamespace ns = XNamespace.Get("http://www.w3.org/2005/Atom"); 

...

from entry in xDoc.Descendants(ns + "entry") 
select new 
{ 
    Id = entry.Element(ns + "id").Value, 
    Categories = entry.Elements(ns + "category").Select(c => c.Value) 
    ... 
}; 

等(未经测试)

2

您需要设置的命名空间。

命名空间中
与XML创建的XName,一个的XName可以在命名空间中,或者它可以在没有命名空间。
对于C#,在命名空间中创建XName的推荐方法是声明XNamespace对象,然后使用加法运算符的覆盖。

http://msdn.microsoft.com/en-us/library/system.xml.linq.xname.aspx

3

当你看到prefix:name,这意味着name在其前缀已被宣布为prefix的命名空间。如果您查看文档的顶部,您会看到一个xmlns:media=somethingsomething是用于任何前缀为media的名称空间。

这意味着你需要为每个命名空间创建的XNamespace需要引用:

XNamespace media = XNamespace.Get("http://search.yahoo.com/mrss/"); 

,然后用media在该命名空间的名字:

media + "group" 

中的命名空间这个文件是:

xmlns="http://www.w3.org/2005/Atom" 
xmlns:app="http://www.w3.org/2007/app" 
xmlns:media="http://search.yahoo.com/mrss/" 
xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" 
xmlns:gd="http://schemas.google.com/g/2005" 
xmlns:gml="http://www.opengis.net/gml" 
xmlns:yt="http://gdata.youtube.com/schemas/2007" 
xmlns:georss="http://www.georss.org/georss"