0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Swift5 XMLParserを使ってXML解析をする①

Last updated at Posted at 2020-11-15

##はじめに
ネット上のXMLデータを解析して、表示します。
XMLデータを解析したアプリを作ったのは初でした。
ただ、やることはJSON解析の時と一緒です。
また、特別なライブラリをインポートすることなくできました。
今回の①では流れとデリゲートメソッドを紹介します。

XCodeのバージョンは 12.2 です

MacOSのバージョンは 11.0.1 です

それではいきましょう。

##XML解析について
XMLで記述されたデータはタグというものに入っています。
具体的には<項目名>という形をとります。
このタグに情報を格納します。
これを解析ではエレメントとか要素とか言いまして、解析をすることで情報を取り出し、使用していきます。
(下記参考画像:総務省 電子政府の総合窓口が提供している法令のXML形式のデータを引用しています。)
XML①kizi.png

検索してもただの文字の羅列ですが、
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()

この記述をするとパースの処理が順に実行されていきます。

##今回はここまで

次回では実際に作ったアプリを元に、
このメソッドを使ったコードを簡単に紹介していきたいと思います。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?