ASP.NET > ASP.NET Core > RSSフィードの読込ライブラリ比較

# RSSフィードの読込ライブラリ比較


## Feed URL
Feed URLは以下を使いました。
https://news.yahoo.co.jp/pickup/computer/rss.xml


## CodeHollow.FeedReader
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49910/9b02a108-7c99-06d7-8c72-32b61420f31a.png)

CodeHollowのFeedReader
https://github.com/codehollow/FeedReader

### サンプルソース
サンプルソース元は以下を使いました。
https://github.com/codehollow/FeedReader/blob/master/FeedReader.ConsoleSample/FeedReader.ConsoleSample.csproj

### 使い方

FeedReader.ReadAsync1行でRssを 読込み変数へセットします。

```
var reader = await FeedReader.ReadAsync(url);
```

以下のような感じにセットされます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/58e6edcc-14d2-c870-a78a-7b94dd2e4cde.png" width=400 />

子要素でループしたい場合には以下のように使います

```
var reader = await FeedReader.ReadAsync(url);
foreach (var item in reader.Items)
{
    Console.WriteLine(item.Title + " - " + item.Link);
}
```

### 結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/544810ca-9259-19f1-35f1-80660ffe35bf.png" width=300 />


## Microsoft.SyndicationFeed.ReaderWriter
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49910/fcb3e88c-d9c3-703a-0aeb-d28c61a2eb2c.png)

Microsoft製のReaderWriterです。
https://github.com/dotnet/SyndicationFeedReaderWriter

### 使い方

サンプルソース元は以下をベースに使いました。
https://github.com/dotnet/SyndicationFeedReaderWriter/blob/master/examples/ReadRssItemWithCustomFieldsExample.cs

RssFeedReader で読込を開始し、feedReader.Read()で逐次読み込んで行きます。
RssFeedReader ではRSSの読込（HTTPリクエスト）は開始せず、最初のfeedReader.Read()でHTTPリクエストを投げる仕様のようです。
feedReader.Read()はboolで読込が継続可能か否かが返るようです。

```CSharp
[AsyncStateMachine(typeof(<Read>d__4))]
public override Task<bool> Read();
```

### 使い方サンプル

以下をベースにしています。
https://github.com/dotnet/SyndicationFeedReaderWriter/blob/master/examples/ReadRssItemWithCustomFieldsExample.cs

```
//
// Create an XmlReader from file
using (var xmlReader = XmlReader.Create(filepath, new XmlReaderSettings() { Async = true }))
{
    var parser = new RssParser();
    var feedReader = new RssFeedReader(xmlReader, parser);

    //
    // Read the feed
    while (await feedReader.Read())
    {
        if (feedReader.ElementType == SyndicationElementType.Item)
        {
            //
            // Read the item as generic content
            ISyndicationContent content = await feedReader.ReadContent();

            //
            // Parse the item if needed (unrecognized tags aren't available)
            // Utilize the existing parser
            ISyndicationItem item = parser.CreateItem(content);

            Console.WriteLine($"Item: {item.Title}");

            //
            // Get <example:customElement> field
            ISyndicationContent customElement = content.Fields.FirstOrDefault(f => f.Name == "example:customElement");

            if (customElement != null)
            {
                Console.WriteLine($"{customElement.Name}: {customElement.Value}");
            }
        }
    }
}

```


### 結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/156be96f-1a66-1d73-2c53-49d6ec0fa936.png" width=300 />


## SimpleFeedReader
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49910/e77081bf-f2d5-4c4a-7d58-fdc68412e145.png)

RobThree/SimpleFeedReader
https://github.com/RobThree/SimpleFeedReader

パッケージを読み込めませんでした。Coreには対応していないようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49910/9a32170f-07d8-185a-72eb-a8153348009f.png)


## nJupiter
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49910/4cfd8f97-90da-8fb8-095d-66d8de2d4a5b.png)

njupiter/njupiter
https://github.com/njupiter/njupiter

警告が出てしまいました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49910/2bf15d9d-41a6-db01-85e0-43dbfbe3085d.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49910/25cacec9-3ced-6a7b-9a2b-4835bf4a658e.png)

```
パッケージ 'nJupiter.Web.Syndication 4.0.2.516' はプロジェクトのターゲット フレームワーク '.NETCoreApp,Version=v2.0' ではなく '.NETFramework,Version=v4.6.1' を使用して復元されました。
このパッケージは、使用しているプロジェクトとの完全な互換性がない可能性があります。
```


# 総括

CodeHollow.FeedReaderは1行でフィードが取得できるところが魅力です。
Microsoft.SyndicationFeed.ReaderWriterは細かく制御したい場合に使うのでしょう。（今のところ利用シーンが想像できませんが）
SimpleFeedReaderとnJupiterはCoreで動作しなかったので試せずでした。


# コード
今回のテストコードは以下に置いています
https://github.com/sugasaki/CSharpFeedReader