##はじめに
ネット上のXMLデータを解析して、表示します。
XMLデータを解析したアプリを作ったのは初でした。
ただ、やることはJSON解析の時と一緒です。
また、特別なライブラリをインポートすることなくできました。
今回の①では流れとデリゲートメソッドを紹介します。
XCodeのバージョンは 12.2 です
MacOSのバージョンは 11.0.1 です
それではいきましょう。
##XML解析について
XMLで記述されたデータはタグというものに入っています。
具体的には<項目名>という形をとります。
このタグに情報を格納します。
これを解析ではエレメントとか要素とか言いまして、解析をすることで情報を取り出し、使用していきます。
(下記参考画像:総務省 電子政府の総合窓口が提供している法令のXML形式のデータを引用しています。)
検索してもただの文字の羅列ですが、
GoogleChromeの拡張機能を入れると、このような形に自動的に変換してくれます。
##XML解析で使うデリゲート
XMLParserDeligeteを使います。UIKitの中に入っているので特段インポートするものはありませんでした。
###XMLParserの流れ
####1.リクエストを投げる用の変数を用意する
インターネットを使うので、当然URL型の変数を用意します。
let url : URL = URL(String:"対象のURLが入ります")
でもいいですし、
let urlString : String = "対象のURLが入ります"
let url(ContentsOf: string("urlString"))
とかでも問題ありません。
####2.変数を用意します
解析したデータの最初の要素グループを入れる宣言を用意します。
var currentElementName : String!
次にそのグループの中に入っている、項目ごとの要素に併せて、型を宣言します。
また、配列の変数を宣言して、要素グループ単位でひとまとめにしてデータを整理します。
クラス宣言
あらかじめ別クラスで要素を定義
コントローラー上でインスタンス化
var element = [String]()
辞書宣言
var element[name:String, ...]
解析するXMLの要素の項目が沢山あると、コードが間延びするので別のクラスを作った方が良いと思います。
別のクラスで要素が入る変数を設定⇒解析するコントローラーで配列を宣言
####3.XMLParserDelegateを実装する
対象のコントローラーにデリゲートを記述します。
####4.デリゲートメソッドを実装する
後述するパースの実行をするとデリゲートメソッドが呼び出され、順に実行されていきます。
#####XMLParserのデリゲートメソット
とりあえず、今回使ったデリゲートを紹介します。
今後、時間が取れ次第他のデリゲートメソッドも紹介していきます。
#####XML解析の開始時
func parserDidStartDocument(_ parser: XMLParser) {
}
ここにはコメントなんかを入れたりします。
######要素の読み込み時
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
}
ここでは、読み込んだ際の準備をします。
具体的には、2で宣言した要素グループがあった場合に要素の変数を空にして、新しい要素を入れる準備をしたりします。
引数のelementNameは要素グループを指します。
######要素が見つかった時の挙動
func parser(_ parser: XMLParser, foundCharacters string: String){
}
ここで要素をどう処理するかについて、記述します。
2で用意した変数に追加します。
クラスで作成した時も、辞書型で宣言した時もどちらも配列の型をとりますので、appendで追加していきます。
######要素が見つかった時の挙動が終わった時
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
}
ここでは次に解析される要素グループの為に、現在入っている要素グループを空にします。
空にしないと次に追加される要素が、前の要素と連結して一つの要素になって配列に入ってしまいます。
######要素の読み込みが終わった時
func parserDidEndDocument(_ parser: XMLParser!)
}
全ての解析が終了した時の処理を書きます。
XML解析はデーブルビューあたりと併用して使うことが多いので、
ここで、テーブルビューの更新をしたりします。
また、ここ以外で更新をしようとすると
の警告が出ます。無視できますが、処理速度はかなり低下します。
####5.パース実行の記述をする
parser.parse()
この記述をするとパースの処理が順に実行されていきます。
##今回はここまで
次回では実際に作ったアプリを元に、
このメソッドを使ったコードを簡単に紹介していきたいと思います。