ぴぽのたわごと

ジャンル問わず。自由気ままに書いてます。

【iOS】XMLを解析する(swift3)

XMLを解析するには 「XMLParse」を使います。
このクラスのデリゲートメソッドによって

  • XML解析の開始/終了
  • 開始/終了タグと中のデータ

などを確認することができます。
詳しくはリファレンスを参照ください。

XMLParserDelegate - Foundation | Apple Developer Documentation

以下サンプルです。

import UIKit
class ViewController: UIViewController, XMLParserDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // XML解析実行
        loadxml()
    }

    // XMLを解析する
    func loadxml(){
        // 解析するXMLのURL
        let urlString = "https://news.yahoo.co.jp/pickup/entertainment/rss.xml"
        
        guard let url = NSURL(string: urlString) else{
            return
        }
        
        // インターネット上のXMLを取得し、NSXMLParserに読み込む
        guard let parser = XMLParser(contentsOf: url as URL) else{
            return
        }
        parser.delegate = self;
        parser.parse()
    }
    
    // XML解析開始時に実行されるメソッド
    func parserDidStartDocument(_ parser: XMLParser) {
        print("XML解析開始しました")
    }
    
    // 解析中に要素の開始タグがあったときに実行されるメソッド
    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
        print("開始タグ:" + elementName)
    }
    
    // 開始タグと終了タグでくくられたデータがあったときに実行されるメソッド
    func parser(_ parser: XMLParser, foundCharacters string: String) {
        print("要素:" + string)
    }
    
    // 解析中に要素の終了タグがあったときに実行されるメソッド
    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        print("終了タグ:" + elementName)
    }
    
    // XML解析終了時に実行されるメソッド
    func parserDidEndDocument(_ parser: XMLParser) {
        print("XML解析終了しました")
    }
    
    // 解析中にエラーが発生した時に実行されるメソッド
    func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
        print("エラー:" + parseError.localizedDescription)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

2行目:XMLParserDelegateの定義
デリゲートを継承します。

12〜26行目:XMLParserの実行処理
対象のXMLを指定、実行します。
HTTPSではないサイトの場合はアクセスできないのでATSを設定する必要があります。(下参照)

28〜56行目:XMLParserの解析処理
開始/終了、データの中身を確認します。

サンプルURLはヤフーさんのエンタメ記事です。
実行結果

XML解析開始しました
開始タグ:rss
要素:

開始タグ:channel
要素:

開始タグ:title
要素:Yahoo!
要素:ニュース・トピックス - エンタメ
終了タグ:title
要素:

開始タグ:link
要素:https://news.yahoo.co.jp/hl?c=c_ent
終了タグ:link
要素:

開始タグ:description
要素:Yahoo! JAPAN
要素:のニュース・トピックスで取り上げている最新の見出しを提供しています。
終了タグ:description
要素:

開始タグ:language
要素:ja
終了タグ:language
要素:

開始タグ:pubDate
要素:Tue, 09 Jan 2018 01:06:36 +0900
終了タグ:pubDate
要素:

開始タグ:item
要素:

開始タグ:title
要素:矢口 再婚「準備はしてます」
終了タグ:title
要素:

開始タグ:link
要素:https://news.yahoo.co.jp/pickup/6267590
終了タグ:link
要素:

開始タグ:pubDate
要素:Mon, 08 Jan 2018 15:00:59 +0900
終了タグ:pubDate
要素:

開始タグ:enclosure
要素:

終了タグ:enclosure
要素:

開始タグ:guid
要素:yahoo/news/topics/6267590
終了タグ:guid
要素:

終了タグ:item
要素:

~~~   略   ~~~

終了タグ:channel
要素:

終了タグ:rss
XML解析終了しました

HTTPSではないサイトの場合はATSを設定する必要があるので注意してください。
info.plistに記述する方法▼
qiita.com

ATSを無効にする方法▼
qiita.com


参考サイト
【iOS Swift入門 #271】NSXMLParserを使ってXMLを解析する - Swift,Objective-Cプログラミング ~ iOS ~