危機感を持った理系学生のプログラミング日記

こんばんわ🦊

まとめたいことができたので書いていきます。

XMLファイルをXMLパーサーに読み込んで解析し、viewに表示してみました。

yahooNewsのXMLファイルを解析して表示すれば、yahooNewsの記事がViewに表示できるようになります。様々なサイトがXMLファイルを公開しているので、tableViewや、SegementSlide等と組み合わせることで、色んなサイトが見栄えよくViewに表示できるようになります。

 

配列の復習

まず、モデルクラスに配列の要素にするためのクラスを作ります。

class NewsItem{

    

    var title:String!

    var url:String!

    var pubDate:String!

}

 

 

配列を扱いたいControllerクラスで、配列インスタンスを作成します。

この配列はNewsItem型の配列なので、1つの要素はtitle,url,pubDateのプロパティで構成されています。

この配列にappendした場合、[NewsItem,NewsItem,NewsItem,NewsItem] こんな感じになり、このNewsItem要素1つ1つに、title,url,pubDateのプロパティが入っています。

//NewsItem型の配列インスタンスを作成

    var newsItem = [NewsItem]()

 

 

XMLParser

 

didStartElement

XMLParserのデリゲートメソッドの1つです。

要素の開始タグがあったら実行されるメソッドです。

XMLParserのデリゲートメソッドでは最初に呼ばれます。

XMLパースの要素の名前がtitleなら、

currentElementName

nil(空)を入れ、newsItem配列に1つ要素(NewsItem型)を追加。

titleでないなら、

currentElementName

XMLパースの要素の名前を代入します。

// 解析中に要素の開始タグがあったときに実行されるメソッド

    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {

        

        currentElementName = nil

        if elementName == "item"{

            

            //配列の中にNewsItem型の要素を1つ追加

            //NewsItem型は、title,url,pubDateのプロパティで構成されている

            self.newsItem.append(NewsItem())

            

            print(elementName)

            print(self.newsItem)

            

            

        }else{

            

            currentElementName = elementName

            print(elementName)

        }

        

    }

 

 

foundCharacters

次に呼ばれるXMLParserのデリゲートメソッドです。

newsItem配列に要素が入っているなら、if文以下が実行されます。

ここで、newsItem配列の要素のプロパティに値を入れていきます。

 // 開始タグと終了タグでくくられたデータがあったときに実行されるメソッド

    func parser(_ parser: XMLParser, foundCharacters string: String) {

        

        print("要素:" + string)

        

        if self.newsItem.count > 0{

            

            let lastItem = self.newsItem[self.newsItem.count - 1]

            

            switch self.currentElementName {

            case "title":

                lastItem.title = string

                

            case "link":

                lastItem.url = string

                

            case "pubDate":

                lastItem.pubDate = string

                

            default:break

            

            }

        }

    }

 

 

didEndElement

3番目に呼ばれるXMLParserのデリゲートメソッドです。

XMLパースの要素の名前にnilを入れてリセットしています。

 // 解析中に要素の終了タグがあったときに実行されるメソッド

    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {

        

        print(elementName)

        

        self.currentElementName = nil

    }

 

 

これら3つのメソッドはXMLパースの要素の名前が変わる毎にグルグル呼ばれます。

実行結果はこんな感じになります。

item

[Swift5IntroApp1.NewsItem]

要素:

 

title

要素:本RSSのURLは変更になりました。新しいRSSのURLへ移行をお願いします。

title

要素:

 

link

要素:https://yahoo.jp/ibOrnq

link

要素:

 

item

要素:

 

item

[Swift5IntroApp1.NewsItem, Swift5IntroApp1.NewsItem]

要素:

 

 

TableViewで表示

 

XMLパーサーで取得したデータをTableViewを使って表示します。

その中でも特にややこしかった、didSelectRowAtに焦点を置きます。

TableViewのセルにXMLパーサーで取得したデータ(ニュースのタイトルとURL)が入っています。セルをタップすると、そのニュースタイトルとURLに基づいたデータをWebViewController(自作のcontroller)で表示します。

key値にニュースのURLの値を入れ、WebViewControllerの方でそれを受け取れるようにします。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        

        //WebViewControllerにurl(キー)を渡して表示したい

        let webView = WebViewController()

        webView.modalTransitionStyle = .crossDissolve

        let news = newsItem[indexPath.row]

        UserDefaults.standard.set(news.url, forKey: "url")

    

        //webViewに画面遷移

        present(webView, animated: true, completion: nil)

        

    }

    

 

 

 

ざっくりとですが少しややこしかった所をまとめました。

ではまた🦊