LoginSignup
1
2

More than 1 year has passed since last update.

SwiftでXMLParseをしてアプリを作ろう

Posted at

初めに

今回作るアプリは名言APIを使って、XML解析をし、ランダムに名言をラベル上に表示するという簡素なアプリです。
XML解析は、JSON解析と比べ少し難しいところがあるので、XML解析の入門としてはぴったりかなと思います。
完成形はこんな感じです。

スクリーンショット 2021-09-02 16.19.47.png

では、始めていきます。

UIの設計

スクリーンショット 2021-09-02 16.20.11.png

ViewControllerを作り、@IBOutlet接続していきます。

ViewController.swift
import UIKit

class ViewController: UIViewController{

    @IBOutlet weak var meigenLabel: UILabel!
}

APIの取得

APIの取得をしていきたいと思います。
名言APIを使います。

そしてこのようにAPIを叩くと、XMLDataデータを返してくれます。
スクリーンショット 2021-09-02 16.27.08.png

そしてXcodeの設定としてhttp通信を許可するために、
Info.plistでこのような設定を行っていきます。
スクリーンショット 2021-09-02 16.28.18.png

ViewController

いよいよXML解析を行っていきます。

ViewController.swift
import UIKit

class FeedItem {
    var meigen = ""
    var auther = ""
}

class ViewController: UIViewController{

    @IBOutlet weak var meigenLabel: UILabel!

    var parser = XMLParser()
    var feedItem = [FeedItem]()

    //nilを許容するから
    var currentElementName:String!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        getXMLData()

        parser.delegate = self
        parser.parse()
    }

    func getXMLData(){
        //XML解析を行う
        let urlString = "http://meigen.doodlenote.net/api?c=1"

        if let url = URL(string: urlString){
            parser = XMLParser(contentsOf: url)!
        }
    }
}

extension ViewController:XMLParserDelegate{
    //デバックをしながら、処理の順番を調べると良い
    //要素解析の開始
    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
        currentElementName = nil
        //①elementName = response
        if elementName == "data" {

            self.feedItem.append(FeedItem())
        }else{
            currentElementName = elementName
        }
    }

    //要素内の値の取得
    func parser(_ parser: XMLParser, foundCharacters string: String) {

        if self.feedItem.count > 0 {
            //meigenとautherを処理していく
            let lastItem = self.feedItem[self.feedItem.count - 1]

            switch self.currentElementName {
            case "meigen":
                //キー値が入る
                lastItem.meigen = string
            case "auther":
                lastItem.auther = string

                meigenLabel.text = lastItem.meigen + "\n" + lastItem.auther
            default:
                //②data
                break
            }          
        }
    }

    //要素の終了時
    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        currentElementName = nil
    }
}

終わりに

これでデータを解析することが出来ました。
コード内でデバックをしながら、どのような順番で解析が行われているのかを調べるとより理解が深まるかと思います。

完成形はこちらにも載せています。
指摘がありましたら、コメントよろしくお願いします。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2