пространство имен атома с использованием linq

У меня есть следующий xml

    <?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
<entry><id><![CDATA[text]]></id><
author><name><![CDATA[film24]]></name></author><title><![CDATA[text]]></title>
<updated>2009-10-30T15:55:13+00:00</updated><published>2009-10-30T00:00:00+00:00</published>
<media:thumbnail type="image/jpeg" title="thumbnail" url=""/>
<media:content type="video/flv" title="video" url="" expression="high"/>
<media:content type="video/flv" title="video" url="" expression="low"/>
</entry>
</feed>

Если я включу следующее пространство имен, я не смогу запросить xml. т.е. он не возвращает никаких результатов.

http://www.w3.org/2005/Atom

Вот как я запрашиваю xml

        XNamespace nsMedia = "http://search.yahoo.com/mrss/";
        XNamespace nsAtom = "http://www.w3.org/2005/Atom";

        string url = HttpContext.Current.Server.MapPath(ConfigHelper.GetValue("FeedUri"));
        var feed = XElement.Load(url);
        var posts = from c in feed.Descendants(nsAtom + "entry")
                    select new CDNEntry
                    {
                         Id = (string)c.Element(nsAtom + "id").Value,
                         Author = (string)c.Element(nsAtom + "author").Value,
                         Title = (c.Element("title") != null) ? (string)c.Element(nsAtom + "title").Value : "",
                         Summary = (c.Element("summary") != null) ? (string)c.Element(nsAtom + "summary").Value : "",
                         Thumbnail = (string)c.Element(nsMedia + "thumbnail").Attribute(nsAtom + "url").Value,
                         FLV = (string)c.Element(nsMedia + "content").Attribute(nsAtom + "url").Value,
                         Updated = DateTime.Parse((string)c.Element(nsAtom + "updated").Value),
                         Published = DateTime.Parse((string)c.Element(nsAtom + "published").Value)
                    };

        return posts.ToList();

person frosty    schedule 29.10.2009    source источник
comment
Вы проверили, что uniqueUrl точно соответствует хотя бы одному элементу идентификатора записи? В качестве первого шага я бы рекомендовал временно удалить лямбда-выражение where, чтобы определить, связана ли проблема с идентификатором или со структурой вашего оператора linq.   -  person Ryan Brunner    schedule 29.10.2009
comment
привет Райан, да, я пробовал это. Чтобы уточнить, это не работает, когда включен xmlns=w3.org/2005/Atom.   -  person frosty    schedule 29.10.2009


Ответы (1)


Ваш образец XML был обрезан, но ваша проблема, скорее всего, заключается в том, что вам нужно использовать больше пространств имен. Попробуйте что-то вроде этого:

XNamespace nsMedia = "http://search.yahoo.com/mrss/";
XNamespace nsAtom = "http://www.w3.org/2005/Atom";

var feed = GetFeed();
var posts = from c in feed.Descendants(nsAtom + "entry")
            where (string)c.Element(nsAtom + "id") == uniqueUrl
            select new CDNEntry
            {
                Id = (string)c.Element(nsAtom + "id"),
                Author = (string)c.Element(nsAtom + "author"),
                Title = (string)c.Element(nsAtom + "title") ?? "",
                Summary = (string)c.Element(nsAtom + "summary") ?? "",
                Thumbnail = (string)c.Element(nsMedia + "thumbnail").Attribute("url"),
                FLV = (string)c.Element(nsMedia + "content").Attribute("url"),
                Updated = (DateTime)c.Element(nsAtom + "updated"),
                Published = (DateTime)c.Element(nsAtom + "published")
            };
person dahlbyk    schedule 31.10.2009
comment
спасибо, очень ценю ваш ответ. Я уверен, что ты прав. Хотя я просто не могу правильно указать пространство имен. Я обновил свой приведенный выше код, чтобы отобразить все xml - person frosty; 02.11.2009
comment
Вы действительно близки, вам просто нужно удалить пространства имен из атрибута (url). Вместо того, чтобы использовать свойство Value, которое может вызвать исключения нулевых ссылок, как вы видите, я предпочитаю использовать различные явные приведения типов, предоставляемые XElement. Приведение к строке в любом случае просто возвращает Value, но возвращает null, если элемент не существует. Точно так же приведение к DateTime (или DateTime? для поддержки нулей) чище, чем синтаксический анализ строки. - person dahlbyk; 03.11.2009
comment
круто, ты прав. Не знал о ?? оператор. Это намного чище. благодаря. - person frosty; 13.11.2009