читать rss элементы с помощью linq - PullRequest
0 голосов
/ 25 февраля 2009

У меня есть следующий RSS-канал, который я хотел бы запросить, чтобы получить все элементы с определенной категорией с именем subchannel. Пока что мне удалось добраться до первого элемента, но только если он первый в списке. Как бы я написал запрос linq для фильтрации RSS-канала, чтобы показать только элементы, где определенный «подканал» соответствует конкретному значению, например. "Точность"?

ура, Chris

protected void Filter()
{
    var feeds = (from item in doc.Descendants("item")
                 where
                 item.CategoryValue("Channel") == "Accomplishment"

                 select new
                 {
                     Title = item.Element("title").Value,
                     rssGuid = item.Element("guid").Value,
                     description = item.Element("description").Value,
                     link = item.Element("link").Value

                 }).ToList();

    ListView1.DataSource = feeds;
    ListView1.DataBind();

}

Метод расширения

public static class ccExtensions
{
    public static string CategoryValue(this XElement item, string type)
    {

          var category = item.Elements("category").FirstOrDefault(c => (string)c.Attribute("domain") == type
          && !string.IsNullOrEmpty(c.Value));

        return category == null ? null : category.Value;

    }
}

RSS выдержка

<item>
            <title>Time Mgmt</title>
            <description>The following is a list of sample values</description>
            <link>http://blah.com/test.aspx</link>
            <category domain="Channel"></category>
            <category domain="Channel">Goals</category>
            <category domain="SubChannel"></category>
            <category domain="SubChannel">Accountability</category>
            <category domain="SubChannel">Accomplishment</category>
            <category domain="SubChannel">Achievement</category>
            <category domain="SubChannel">Accuracy</category>
            <category domain="SubChannel">Agility</category>
            <category domain="SubChannel">Ambition</category>
            <category domain="SubChannel">Anticipation</category>
            <category domain="SubChannel">Appreciation</category>
            <category domain="SubChannel">Assertiveness</category>
            <category domain="SubChannel">Beauty</category>
            <category domain="Type"></category>
            <category domain="Type">Time Management</category>
            <guid>5e993951-da49-400b-b8d4-68b95628b9d5</guid>
</item>

1 Ответ

2 голосов
/ 25 февраля 2009

Проблема в том, что ваше CategoryValue возвращает одну строку, несмотря на то, что у вас есть несколько категорий. Я предлагаю вам изменить его на:

public static class ccExtensions
{
    public static IEnumerable<string> Categories(this XElement item,
                                                 string type)
    {
        return from category in item.Elements("category")
               where (string) category.Attribute("domain") == type
                     && !string.IsNullOrEmpty(category.Value)
               select category.Value;
    }
}

затем измените ваш запрос на:

from item in doc.Descendants("item")
where item.Categories("SubChannel").Contains("Accomplishment")
select ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...