Edited at

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

More than 1 year has passed since last update.


前回のまとめ

前回はxcodeをインストールしてios-chartsでグラフを描画するまでやりました。

https://qiita.com/ioschartsman/items/2e510d311cc4fcd25608


今回すること

XMLファイルを読み込む

これでエクセルで作ったデータをエクセルの機能でXML化してデータを読み込めると思う。

実際これ書いてる自分がわかってないから、ちゃんと調べれたら調べた方がいいよ。ってか教えて欲しい。


まずXMLファイルを用意する

今回できるのはtestって名前のファイルだからtestって名前つけて、



名前をつけて保存からファイルの形を.xmlに指定して保存



これでXMLファイルの完成。


ファイルをアプリに入れる

プロジェクト作ったばかりの時の左側(今回プロジェクト名はsample)



こんな感じだと思う。

さっき作ったファイルをここにドラッグして入れれば



なんか言われる。もちろん深く考えずにFinishしちゃう。



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)
}

}
}


実行した。パース成功したらしい。

わかんないけどよかった!でもパースしてなくても、ファイルがあればパース成功って言うから注意だよ!


実機では

こんなプログラムで動くらしい


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)
}
}
}


結果。成功した。

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

あと実機で実行するのは説明だるいからどこかで調べて見て・・・

今回はシミュレータで実行します


SAX型で読み込む

XMLを読み込む方法は2種類あって、DOM型とSAX型があるよ!

詳しいことはここじゃないどこかで説明されてると思うよ!

今回はSAX型のプログラムを載せるよ!


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)
}
}


SAX型で読みこむにはclassのところで

class ViewController: UIViewController , XMLParserDelegate {

って宣言しないとXML読み込むファンクション作っても意味ないから注意だよ!

でparser!.parser()ってところからファイル読み込みスタートして、XMLの中をファンクションで回っていく

実行したら結果こうなったよ!



結果からじゃちょっとわかりづらいけど、ちゃんと読み込めてるみたい!

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