SwiftyXMLParser + Moya + RxSwift 使ってみた

https://s3-ap-northeast-1.amazonaws.com/hatena.masegi/SwiftyXMLParser/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2018-11-19+3.44.29.png

iOSアプリを開発中にXMLを返すAPIを使うことになったので、XML形式のものをどうマッピングするかを忘れないように記事にしました。

なんでSwiftyXMLParserを使うの?

iOSでは標準でXMLParserを用意しています。

ではなぜXMLParserを使わないかというと、

  • 使い勝手が悪い
  • Rxと組み合わせて使うとなると色々大変

だからです。

サードパーティのXMLParser Libraryは何個かありますが、今回は

  • Moya (Alamoifre) と一緒に使う
  • Rxをゴリゴリ使っているプロジェクト

という状況だったのと、Star数を鑑みてSwiftyXMLParserを選択しました。

github.com

SwiftyXMLParserの使い方

導入の仕方、それぞれの要素へのアクセスの仕方については、READMEを参考にしてください。

ここでは、READMEに書いていない実際に使うときにはどうするかを書いていきます。

Modelへのマッピング

例としてradikoの番組を取得するAPIを使ってみます。(最近ではXML形式のレスポンスを返すAPI少なくて、探すの大変でした....)

以下のXML形式データをModelへマッピングします。

<station id="QRR">
  <name>文化放送</name>
  <progs>
    <date>20181119</date>
    <prog id="9463445504" master_id="" ft="20181119010000" to="20181119013000" ftl="2500" tol="2530" dur="1800">
      <title>加隈亜衣のアズールレーディオ</title>
      <url>http://www.joqr.co.jp/azur/</url>
      <pfm>加隈亜衣</pfm>
      <img>
        https://radiko.jp/res/program/DEFAULT_IMAGE/QRR/cl_20180328180436_859305.jpg
      </img>
      <metas>
        <meta name="twitter" value="#アズラジ"/>
        <meta name="twitter" value="from:azuradio_joqr"/>
      </metas>
    </prog>
    <prog id="9463445505" master_id="" ft="20181119013000" to="20181119020000" ftl="2530" tol="2600" dur="1800">
      <title>スクエニ第10BD開発局</title>
      <url/>
      <pfm>日高里菜 大久保瑠美</pfm>
      <img>
        https://radiko.jp/res/program/DEFAULT_IMAGE/QRR/20160927220522.png
      </img>
      <metas>
        <meta name="twitter" value="#joqr"/>
        <meta name="twitter" value="from:joqrpr"/>
      </metas>
    </prog>
  </progs>
</station>

XMLParsableプロトコルを作成する

SwiftyXMLParserのオブジェクトであるXML.Accessorからイニシャライズ可能を示す、XMLParsableを作成します。

XMLParsableを実装する

各ModelにXMLParsable#init(accessor: XML.Accessor)を実装します。

ネストしたオブジェクト・配列・attributeへのアクセスなど、引っかかりそうなものは拾い上げたので、

マッピングで苦戦している方は比較して真似してみてください。

Moya + RxSwift

Moyaのセットアップ

Moyaのセットアップについては、こちらを参考にしてください。

Serviceの作成

RxSwiftのSingleを返す関数を用意します。map()を使うことで、綺麗に書くことができます。

完成!

終わりに

XMLを返すapi絶滅危惧種ですが、使わざるを得ない際は参考にしてみてください。