読者です 読者をやめる 読者になる 読者になる

Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Swift入門 #271】NSXMLParserを使ってXMLを解析する

iOS Swift Swift2.0 XML NSXMLParser

この記事を読んでわかること

  • XMLデータの解析方法

XMLの解析

XMLの解析にはNSXMLParserクラスを使う。
このクラスに用意されているデリゲートメソッドを使うことで解析できる。

用意されているデリゲートメソッドは下記の通り。

  • XML解析開始時に実行されるメソッド
  • 解析中に要素の開始タグがあったときに実行されるメソッド
  • 開始タグと終了タグでくくられたデータがあったときに実行されるメソッド
  • 解析中に要素の終了タグがあったときに実行されるメソッド
  • XML解析終了時に実行されるメソッド
  • 解析中にエラーが発生した時に実行されるメソッド

※ 他にもあるのでリファレンスで参照してみましょう。
NSXMLParserDelegate Protocol Reference

サンプル

このブログのRSSデータを使います。 http://swift.swift-studying.com/rss

NSXMLParserを使うためのプロジェクト設定
  1. プロジェクト設定を開く
  2. 「Build Phase」タブを開く
  3. Link Binary With Librariesで+ボタンを押し、「libxml2.tbd」を追加する

f:id:fjswkun:20160123123428p:plain

f:id:fjswkun:20160123123443p:plain

ATS無効設定

後にインターネットアクセスするため、下記記事を参考にATSを無効にします。 Swift - App Transport Security Settings => ATSの設定を無効化する. - Qiita

XMLデータ読み込み

XMLデータの取得する方法は2つある。

  • XMLファイルからXMLデータを取得する方法
  • URLを指定してインターネット上からXMLデータを取得する方法

ここでは
「2. URLを指定してインターネット上からXMLデータを取得する方法」
で試していく。

1. ViewController.swiftを開き、下記のように書く。

import UIKit

class ViewController: UIViewController, NSXMLParserDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // XML解析実行
        loadxml()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // XMLを解析する
    func loadxml(){
        let url_text = "http://swift.swift-studying.com/rss"
        
        guard let url = NSURL(string: url_text) else{
            return
        }
        
        // インターネット上のXMLを取得し、NSXMLParserに読み込む
        guard let parser = NSXMLParser(contentsOfURL: url) else{
            return
        }
        parser.delegate = self;
        parser.parse()
    }
}
XMLデータ解析

XML解析開始時に実行されるメソッド

1. ViewController.swiftに下記メソッドを追加します。

// XML解析開始時に実行されるメソッド
func parserDidStartDocument(parser: NSXMLParser) {
    print("XML解析開始しました")
}

2. ビルドしてデバッグしてみます。 メソッドが実行されていることがわかりました。

f:id:fjswkun:20160123125444p:plain

3. その他のデリゲートメソッドも実装したのが下記です。

import UIKit

class ViewController: UIViewController, NSXMLParserDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // XML解析実行
        loadxml()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // XMLを解析する
    func loadxml(){
        let url_text = "http://swift.swift-studying.com/rss"
        
        guard let url = NSURL(string: url_text) else{
            return
        }
        
        // インターネット上のXMLを取得し、NSXMLParserに読み込む
        guard let parser = NSXMLParser(contentsOfURL: url) else{
            return
        }
        parser.delegate = self;
        parser.parse()
    }
    
    // XML解析開始時に実行されるメソッド
    func parserDidStartDocument(parser: NSXMLParser) {
        print("XML解析開始しました")
    }
    
    // 解析中に要素の開始タグがあったときに実行されるメソッド
    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
        print("開始タグ:" + elementName)
    }
    
    // 開始タグと終了タグでくくられたデータがあったときに実行されるメソッド
    func parser(parser: NSXMLParser, foundCharacters string: String) {
        print("要素:" + string)
    }
    
    // 解析中に要素の終了タグがあったときに実行されるメソッド 
    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        print("終了タグ:" + elementName)
    }
    
    // XML解析終了時に実行されるメソッド
    func parserDidEndDocument(parser: NSXMLParser) {
        print("XML解析終了しました")
    }
    
    // 解析中にエラーが発生した時に実行されるメソッド
    func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
        print("エラー:" + parseError.localizedDescription)
    }
}
実行
XML解析開始しました
開始タグ:rss
要素:
  
開始タグ:channel
要素:
    
開始タグ:title
要素:Swift,Objective-C
要素:プログラミング ~ iOS ~
終了タグ:title
要素:
    
開始タグ:link
要素:http://swift.swift-studying.com/
終了タグ:link
要素:
    
開始タグ:description
要素:Objective-C,Swift,Apple Watch
要素:などのプロどのプロ\343\202グラミング
終了タグ:description

要素のテキストにタグが入っているとうまく解析できないです。
NSXMLParserを使って、RSSデータ(XML形式)の解析を実装するのはなかなか時間がかかりそうだと感じました。

RSSの解析はGoogleが提供しているAPIを使ったりして、
XMLJSONに変換してからのほうが使いやすい。

おわりに

サンプルで作成したプロジェクトを下記に保存しています。 よかったら参照してください。 SampleXMLParser.zip - Google ドライブ

参考情報

Swift

iOSアプリ開発未経験の人向け
iOSアプリ開発をはじめたとき最初に買った書籍 【アプリ作成未経験の人向け】
Storyboardを使って画面を作成していく。
手順にしたがって操作していくと、ボタンの作成やWebViewの作成などができる。
アプリって、こんな感じで作るんだというのを体験できる。

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版