SwiftでXMLファイルを読み込む

#前回のまとめ
前回はxcodeをインストールしてios-chartsでグラフを描画するまでやりました。
https://qiita.com/ioschartsman/items/2e510d311cc4fcd25608
#今回すること
XMLファイルを読み込む
これでエクセルで作ったデータをエクセルの機能でＸML化してデータを読み込めると思う。
実際これ書いてる自分がわかってないから、ちゃんと調べれたら調べた方がいいよ。ってか教えて欲しい。

##まずＸMLファイルを用意する
今回できるのはtestって名前のファイルだからtestって名前つけて、
![スクリーンショット 2018-02-26 17.15.24.png](https://qiita-image-store.s3.amazonaws.com/0/231811/284f7922-c18b-b2c3-95f0-60f52a4d2ca6.png)
名前をつけて保存からファイルの形を.xmlに指定して保存
![スクリーンショット 2018-02-26 17.17.07.png](https://qiita-image-store.s3.amazonaws.com/0/231811/ea642e12-fa55-9285-0224-657e04b2eb1a.png)
これでＸMLファイルの完成。

##ファイルをアプリに入れる
プロジェクト作ったばかりの時の左側（今回プロジェクト名はsample）
![スクリーンショット 2018-02-26 17.18.56.png](https://qiita-image-store.s3.amazonaws.com/0/231811/67d58051-4249-7c87-130f-f44901a15dfa.png)
こんな感じだと思う。
さっき作ったファイルをここにドラッグして入れれば
![スクリーンショット 2018-02-26 17.26.04.png](https://qiita-image-store.s3.amazonaws.com/0/231811/d234b1bc-fbda-9598-53f2-e9dd4f6cf0df.png)
なんか言われる。もちろん深く考えずにFinishしちゃう。
![スクリーンショット 2018-02-26 17.27.47.png](https://qiita-image-store.s3.amazonaws.com/0/231811/f86c4246-f426-1d2c-6ae9-028a353efb05.png)
test.xmlが入ったね！

##（シミュレータで）読み込むプログラム
早速読み込むよ！
このプログラムは自分が作ったわけじゃないからよくわかんないよ！
とりあえずtest.xmlってやつしか読み込めないことだけはわかるよ！

```ViewController.swift
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //シミュレータでできるファイル処理
        let path: NSString? = Bundle.main.path(forResource: "test", ofType: "xml")! as NSString
        if (path == nil){
            print("file does not exist.")
            exit(0)
        }
        let url: NSURL? = NSURL(fileURLWithPath: path! as String)
        let parser: XMLParser? = XMLParser(contentsOf: url! as URL)
        
        if parser != nil{
            parser!.delegate = self as? XMLParserDelegate
            parser!.parse()
            
            //確認出力
            print("\n" + "parser!出力")
            print(parser!)
            
            print("パース成功")
        }else{
            print("パース失敗")
            exit(0)
        }
        
    }
}
```

実行した。パース成功したらしい。
わかんないけどよかった！でもパースしてなくても、ファイルがあればパース成功って言うから注意だよ！
![スクリーンショット 2018-02-26 17.39.30.png](https://qiita-image-store.s3.amazonaws.com/0/231811/2c771538-2ac1-136a-4ab8-f7df6df3b9fb.png)

###実機では
こんなプログラムで動くらしい

```ViewController.swift
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //実機でできるファイル処理
        let dirPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        print(dirPath)
        
        let filePath = dirPath + "/test.xml"
        let filePathNSURL: NSURL = NSURL(fileURLWithPath: filePath)
        let parser: XMLParser? = XMLParser(contentsOf: filePathNSURL as URL)
        
        // ディレクトリにあるファイルのパス一覧を取得
        let manager: FileManager = FileManager.default
        if let list:[String] = try! manager.contentsOfDirectory(atPath: dirPath) {
            for key in list {
                print(key)
            }
        }
        
        if parser != nil{
            parser!.delegate = self as? XMLParserDelegate
            parser!.parse()
            
            //確認出力
            print("\n" + "parser!出力")
            print(parser!)
            
            print("パース成功")
        }else{
            print("パース失敗")
            exit(0)
        }
    }
}
```

結果。成功した。
![スクリーンショット 2018-02-26 17.47.02.png](https://qiita-image-store.s3.amazonaws.com/0/231811/7f6264db-ab17-722d-e054-9a68b424bd9b.png)

ごめんなさい本当にわかんないので説明とかないです。

あと実機で実行するのは説明だるいからどこかで調べて見て・・・
今回はシミュレータで実行します

##SAX型で読み込む
ＸMLを読み込む方法は２種類あって、DOM型とSAX型があるよ！
詳しいことはここじゃないどこかで説明されてると思うよ！
今回はＳAX型のプログラムを載せるよ！

```ViewController.swift
import UIKit

class ViewController: UIViewController , XMLParserDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //シミュレータでできるファイル処理
        let path: NSString? = Bundle.main.path(forResource: "test", ofType: "xml")! as NSString
        if (path == nil){
            print("file does not exist.")
            exit(0)
        }
        let url: NSURL? = NSURL(fileURLWithPath: path! as String)
        let parser: XMLParser? = XMLParser(contentsOf: url! as URL)
        
        if parser != nil{
            parser!.delegate = self
            parser!.parse()
            
            //確認出力
            print("\n" + "parser!出力")
            print(parser!)
            
            print("パース成功")
        }else{
            print("パース失敗")
            exit(0)
        }
    }
    
    //XMLパーサーの処理
    // 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)
    }
}
```

ＳAX型で読みこむにはclassのところで
`class ViewController: UIViewController , XMLParserDelegate {`
って宣言しないとＸML読み込むファンクション作っても意味ないから注意だよ！

でparser!.parser()ってところからファイル読み込みスタートして、ＸMLの中をファンクションで回っていく
実行したら結果こうなったよ！
![スクリーンショット 2018-02-26 18.15.11.png](https://qiita-image-store.s3.amazonaws.com/0/231811/c650f422-1e2d-581f-18eb-6656cec562b8.png)
結果からじゃちょっとわかりづらいけど、ちゃんと読み込めてるみたい！

必要なデータだけ読み込むとしたらちょっと工夫必要っぽいから頑張って！！