XMLのハンドリングについて、Curlでは、いくつかの方法が用意されています。
ここでは、WSDKというCurlの開発をサポートするキットで提供されている、
XPath表現を使ったハンドリングの例をご紹介します。
このエントリで紹介するアプリでは、顔ラボ から提供されている、画像の顔位置検出APIのXMLデータを利用しています。
顔ラボのサービスに画像のURLを渡すと、顔情報が保持されたXMLが返却されます。
■顔ラボ 返却XML例
<results version=”1.0″ xmlns=”http://xmlns.kaolabo.com/detect”> <faces> <face height=”60″ score=”742″ width=”60″ x=”234″ y=”117″> <left-eye x=”275″ y=”136″ /> <right-eye x=”253″ y=”136″ /> </face> <face height=”48″ score=”705″ width=”48″ x=”303″ y=”138″> <left-eye x=”336″ y=”153″ /> <right-eye x=”318″ y=”153″ /> </face> <face height=”36″ score=”505″ width=”36″ x=”134″ y=”143″> <left-eye x=”159″ y=”153″ /> <right-eye x=”145″ y=”153″ /> </face> </faces> </results> |
results タグの中に、顔として認識されたブロックの位置情報が face タグとして格納されています。
各 face タグ の中には、属性として各顔位置情報が、
タグとして目の位置情報がそれぞれ格納されています。
顔ラボの詳細な仕様については、 http://kaolabo.com を見てください。
■顔マスクアプリ解説
顔マスクアプリ ([developers.curlap.com] に対する特権が必要です。)
上記WEBサービスを利用した顔マスクアプリケーションでは、
start.curl内の、下記コード部にて、返却されたXMLをXPathで解析しています。
|| XML構造をモデル化 ・・・ || 画像内の顔位置を示すXMLを解析する let fr:ImageMask = |
■{build-xml preserve-whitespace? = false, strb}
build-xml プロシージャを利用することで、対象のXMLをモデル化することが出来ます。
XDMDocument.root から XDMElementクラス型のXMLツリー全体を取得しています。
■{model.search “//*[name()=’face’]
{XDMElement.search XPath表現} では、XPath表現に合ったノードが、XDMNodeSetとして返却されます。
ここでは、XML内のタグで face という名前のタグをを取得しています。
さらに XDMNodeSetのサイズを、for文のカウントとして利用しています。
これによってXML内の顔情報の数だけループすることになります。
■{model.search “//*[name()=’face’][” & i &”]/@height”}
ループのカウントを表す変数 i を使って、順番に顔情報のタグを扱っています。
属性情報を取得するXPath表現である @ を利用して、height という属性の値を取得しています。
また、XDMNodeSet.as-int で、返却されたデータを int型で扱うようにしています。
XPathは、このプログラムで利用している表現以外にも、いろいろな書き方があります。
下記リソースなどを利用して、簡易なXMLハンドリングを試してみてください。
■XPath W3C 勧告
http://www.infoteria.com/jp/contents/xml-data/REC-xpath-19991116-jpn.htm