XPathQueryを使ったXMLのパース

iPhoneでは標準でlibxml2とNSXMLParserという2種類のXMLをパースするためのライブラリが使えるのだが、XPathQueryという前者のlibxml2のラッパーをMatt Gallagherさんという方が作っているので、その使い方をメモしておく。


[設定]
1. XPathQueryのサイトからソースコードが入ったzipファイルをダウンロード。
2. zipファイルに含まれるXPathQuery.mとXPathQuery.hをiPhoneのプロジェクトにコピーする
3. XCodeのプロジェクトの設定で、ビルドのヘッダ検索パス/usr/include/libxml2を追加する
4. XCodeのプロジェクトにlibxml2.dylibのライブラリを追加する


[使い方]
例えば以下のようなXMLファイルをダウンロードしてきてパースしたいとする。

<?xml version="1.0" encoding="UTF-8"?>
<files>
  <file name="C-1998-768_files.xml" source="original">
    <format>Metadata</format>
  </file>
  <file name="C-1998-768_meta.xml" source="original">
    <format>Metadata</format>
  </file>
</files>


XPathQueryを使ってXML中のファイル名を取得する場合には、以下のようなコードとなる。

NSURL *url = [NSURL URLWithString:@"http://hoge.com/hoge.xml"];
NSData *data = [NSData dataWithContentsOfURL:url];
NSArray *filenames = PerformXMLXPathQuery(data, @"/files/file/@name");
for (NSDictionary *dic in filenames) {
    NSLog(@"filename: %@", [dic objectForKey:@"nodeContent"]);
}


上記のようにXPathを使ってシンプルなXMLファイルをパースする場合には、このXPathQueryは結構便利そうである。
ちなみにXPathQueryはHTMLのパースにも対応しており、PerformXMLXPathQueryという関数をPerformHTMLXPathQueryに変えるだけで、HTMLのパースも可能となる。


[参考記事]