↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > RSSリーダで利用するAPIを検証してみる

RSSリーダで利用するAPIを検証してみる

ニュースアプリの様なRSSを表示させたいのですがXMLを処理するAPIが数点存在するようです。 Swiftにあったものを見つけ出せたらと思います。

サンプル画像

参考:SwiftのRSS Readerを100行で作ったよ
参考:iOS初心者がSwiftでグノシーみたいなタブ型RSSリーダーを作ってみた
参考:SwiftだけでRSSリーダーを作ってみた
参考:MWFeedParser を Swift で使ってみる
参考:Foundation Framework Reference NSXMLParser Class Reference
参考:XML Parsing in Swift Language – iOS 8 – NSXMLParser
参考:SwiftでiOS開発:RSSリーダー
参考:iOSアプリでXMLを解析する方法(NSXMLParser)【基礎編】

ざっとみたところNMFeedParserとFoundationに含まれる標準のNSMMLParserを利用する場合があるようですので検証します。利用対象はYahooのニュースにしてみます。 http://rss.dailynews.yahoo.co.jp/fc/rss.xml 

やってみた

NMFeedParser

こちらはGitHubからソースを取り出しプロジェクトに追加、ObjectiveCで記載されていますので、 ブリッジヘッダでObjective-CとSwiftの掛け渡し処理を事前に行います。詳しくはこちらー>Objective-CとSwiftの共存

結果:15分ほどいじっていたのですが、GitHubのソースもでライブラリだけと分けられておらず(?)簡単に実装できませんでした。コンパイルまで進めましたが APP起動時に落ちる等、どうもうまく処理がはしりませんので保留。なの解析もできず、、、、。導入はもしかすると簡単ではないのかもしれません(私が未熟なだけかもですが、、、)

NSXMLParser

こちらは迷わず実装できました。YahooニュースからタイトルとLinkだけを取得しているサンプルです。これを元に自由にカスタマイズしてください!  解析の順序を理解していないと混乱するのかもしれませんが、要はタグで囲まれた文字列があったとすると、開始タグー>間の文字列ー>終了タグ 次の要素の開始タグー>間の文字列ー>終了タグ、 とパース処理が実行されてきます。それぞれ処理するparser関数が違うのでデバッグで処理してみてください。下に結果のログも参考にご確認ください。大きなタイトルとサブタイトルが混合されていますが、そのあたりはこれを元にカスタマイズいただければ感謝です。


import UIKit

class ViewController: UIViewController,NSXMLParserDelegate {
    
    var isTitle:Bool=false
    var isLink:Bool=false
    
    var parser = NSXMLParser()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        var url:String="http://rss.dailynews.yahoo.co.jp/fc/rss.xml"
        var urlToSend: NSURL = NSURL(string: url)!
        parser = NSXMLParser(contentsOfURL: urlToSend)!
        parser.delegate = self
        
        //以下の1行の処理でparse関連の処理が行われる。
        var success:Bool = parser.parse()
        
        if success {
            println("パース成功")
        } else {
            println("パース失敗")
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    // ここから下はParse関連処理
    
    //開始タグを読み込んだ時よばれる - Start
    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
        if (elementName == "title"){
            isTitle = true;
        }else if(elementName == "link"){
            isLink = true;
        }
    }
    
    //閉じタグを読み込んだ時よばれる - End
    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        
        if (elementName == "title"){
            isTitle = false;
        }else if(elementName == "link"){
            isLink = false;
        }
    }
    
    //タグ以外のテキストを読み込んだ時(タグとタグ間の文字列)
    func parser(parser: NSXMLParser, foundCharacters string: String?) {
        
        if(isTitle)
        {
            println("タイトル=\(string)")
        }else if (isLink){
            println("リンク=\(string)")
        }
    }
    //エラー発生時
    func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
        NSLog("failure error: %@", parseError)
    }
}

上記のコードを実行すると以下がログ出力されます


タイトル=Optional("Yahoo!")
タイトル=Optional("ニュース・トピックス - トップ")
リンク=Optional("http://news.yahoo.co.jp/")
タイトル=Optional("川内原発 きょう午前再稼働")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/domestic/nuclear_power_plant_reoperation/?id=6170182")
タイトル=Optional("70")
タイトル=Optional("年談話「おわび」に言及へ")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/domestic/abe_cabinet/?id=6170195")
タイトル=Optional("舛添氏 新国立完成前倒し要請")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/domestic/new_national_stadium/?id=6170183")
タイトル=Optional("旧日本軍の巨大地下壕を公開")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/domestic/defence_policy/?id=6170170")
タイトル=Optional("境内で半裸ライブ 遺族ら反発")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/local/ibaraki/?id=6170192")
タイトル=Optional("上原 右手首骨折で今季絶望")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/sports/uehara_koji/?id=6170194")
タイトル=Optional("本田翼は棒? 月9の通説に反論")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/entertainment/sereal_tv_drama/?id=6170184")
タイトル=Optional("神野美伽 荒木氏と離婚へ")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/entertainment/divorce/?id=6170189")
パース成功

まとめ

Foundationの標準クラスのNSXMLParserで十分対応可能です。

↓こんな記事もありますよ!


2021-05-14 14:21:41

WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。

AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、 昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は...

2021-05-06 14:04:37

LINEのアニメーションスタンプ制作の落とし穴、、、失敗談

ゴールデンウィークにLINEスタンプを作成してみました。 作り切って申請も通したんですが、意図したアニメーションと違う、、、、 LINEクリエーターの画面だと、アニメーションのプレビュー...

2021-05-01 18:05:35

久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。

忘れないようにメモ エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。 ターゲット→ex...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!