Использование LINQ to XML для обработки XML в нескольких пространствах имен

2

Я пытаюсь разобрать результаты из 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)

Может ли кто-нибудь сказать мне, что я здесь делаю неправильно?

  • 0
    Ваша первая проблема - не удалось опубликовать пример ошибочного XML. Я не знаю, в чем твоя вторая проблема, из-за твоей первой проблемы.
  • 0
    Может быть, ваша вторая проблема в том, что вы не установили точку останова в цикле foreach? Вы пробовали это, или вы зависели от отладчика?
Показать ещё 5 комментариев
Теги:
linq-to-xml

3 ответа

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)
    ...
};

и т.д. (непроверенный)

  • 0
    Это исправило это. Спасибо! Просто так я понимаю, зачем мне добавлять пространство имен перед именем каждого элемента. Поскольку элемент просто <id> не <id namespace> или что-то ... Я бы предположил, что если бы пространство имен было необходимо, я бы добавил его только один раз в XDocument.
  • 0
    Поскольку пространство имен наследуется, <id> находится в том же пространстве имен. Вам необходимо определить все, что не входит в пространство имен по умолчанию.
Показать ещё 4 комментария
3

Когда вы видите 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"
2

Вам нужно установить пространство имен.

Создание XName в пространстве имен
  Как и в случае с XML, имя XName может находиться в пространстве имен или не может быть без пространства имен.
  Для С# рекомендуемым методом создания XName в пространстве имен является объявление объекта XNamespace, а затем использование переопределения оператора сложения.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню