2009-05-21
XMLのパース周り
XMLのパースを行おうとする場合、TouchXMLなどのライブラリが既に存在しますが、ノードそのものの保持まではしなくてもいいけどXML中の値を取りたい時にはXPathQueryがいいかもしれません。
使い方
XPathQuery.hとXPathQuery.mをプロジェクト内にコピーして、libxml2.dylibをインポートします。あとはXPathQueryを使いたいクラスにてインポートするだけ。ダウンロードしたデータをパースしたい場合などは、NSUrlConnectionで引っ張ってきたNSDataと値取得のためのXPathを引数にあてます。
追記(2009/06/14)
プロジェクトのヘッダ検索パスに
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS○○.sdk/usr/include/libxml2
と入れる必要があります。iPhoneOS○○.sdkはバージョンにあわせてください。配布元にも書かれていますが、念のため。
(追記ここまで)
XPath
XPathQueryでのネックはXPathが使いこなせるかどうか、というところです。正常に記述できているのか確認するのが結構手間ですが、FirefoxアドオンにXPath Checkerというものがあるのでこれがおすすめ。あとはチートシートとか。
指定のコツ
WedataのSiteInfoではrootから順番にノードを下っていく形でXPathを記述しますが、今回の場合は取得するノード名とそのノードに関する関係情報を指定する形で記述します。
たとえば以下のxmlからsignupsの値を取得する場合。15468247がその対象です。
<llsd> <map> <key>stats</key> <map> <key>signups</key> <integer>15468247</integer> <key>signups_updated_unix</key> <integer>1242834901</integer> <key>signups_updated_slt</key> <string>2009-05-20 08:55:01</string> </map> </map> </llsd>
SiteInfoでは
//key[text()='signups']/following-sibling[0]/text()
な具合に記述しますが、XPathQueryの場合は
//integer[preceding-sibling::key[text()="signups"] and position()=1]/text()
というスタイルになります。