XMLをValueObjectにマッピングしようとしているんだけど、DOMやらXPATHやらを使ってやろうとすると処理が非常に冗長になってしまう。何かうまい方法は無いものか。DOMXPath::queryの返り値が常にListなのがつらいなぁ。DBからデータを取得するときの処理のやり方とは考え方を変える必要があるのかもしれない。きっと何か一般的なやり方があるんだろうな。とりあえず現在のコード。さらしておくと偉い人が指摘してくれるらしい。

<?php
Class StoreDao
{
  private $keyID;
  private $url;

  function __construct()
  {
    $this->keyID = "keyID";
    $this->url = "http://api.gnavi.co.jp/ver1/RestSearchAPI/?keyid=".$this->keyID;
  }

  public function getStoresByLocation($latitude, $longitude, $range)
  {
    $access = $this->url."&latitude=".$latitude."&longitude=".$longitude."&range=".$range;
    return $this->getDatasByUrl($access);
  }

  protected function getDatasByUrl($access)
  {
    $xml = DomDocument::load($access);
    $xpath = new DOMXPath($xml);

    $ids = $xpath->query("/response/rest/id/text()");
    $names = $xpath->query("/response/rest/name/text()");
    $urls = $xpath->query("/response/rest/url/text()");
    $addresses = $xpath->query("/response/rest/address/text()");

    $datas = array();
    for($i = 0; $i<$ids->length; $i++)
      {
	$data = new Store();
	$data->setID($ids->item($i)->wholeText);
	$data->setStoreNm($names->item($i)->wholeText);
	$data->setUrl($urls->item($i)->wholeText);
	$data->setAddress($addresses->item($i)->wholeText);
	array_push($datas, $data);      
      }
    return $datas;
  }
}
?>