Hatena::Groupiphone-dev

haoyayoi Dev Style このページをアンテナに追加 RSSフィード

2009-05-21

XMLのパース周り

| 08:43 | XMLのパース周り - haoyayoi Dev Style を含むブックマーク はてなブックマーク - XMLのパース周り - haoyayoi Dev Style XMLのパース周り - haoyayoi Dev Style のブックマークコメント

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

というスタイルになります。