Я пытаюсь разобрать результаты из API YouTube. Я правильно получаю результаты как строку, но не могу правильно ее разобрать.
Я следил за предложениями по предыдущему потоку, но я не получаю никаких результатов.
Мой пример кода:
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 явно имеет допустимые значения.
Значение переменной ответа (Sample XML) можно увидеть здесь: http://snipt.org/lWm
(FYI: схема youTube приведена здесь: http://code.google.com/apis/youtube/2.0/developers_guide_protocol_understanding_video_feeds.html)
Может ли кто-нибудь сказать мне, что я здесь делаю неправильно?
Все данные находятся в " 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)
...
};
и т.д. (непроверенный)
<id>
находится в том же пространстве имен. Вам необходимо определить все, что не входит в пространство имен по умолчанию.
Когда вы видите prefix:name
, это означает, что name
находится в пространстве имен, префикс которого был объявлен как prefix
. Если вы посмотрите вверху документа, вы увидите xmlns:media=something
. something
- это пространство имен, используемое для чего-либо с префиксом media
.
Это означает, что вам необходимо создать пространство имен XNames для каждого пространства имен, которое необходимо указать:
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"
Вам нужно установить пространство имен.
Создание XName в пространстве имен
Как и в случае с XML, имя XName может находиться в пространстве имен или не может быть без пространства имен.
Для С# рекомендуемым методом создания XName в пространстве имен является объявление объекта XNamespace, а затем использование переопределения оператора сложения.
http://msdn.microsoft.com/en-us/library/system.xml.linq.xname.aspx