はじめに
本連載では、PHP上で動作するアプリケーションフレームワーク「Zend Framework」について紹介していきます。今回はDOMドキュメントを扱うためのモジュールであるZend_Domについて紹介します。
 現在、Zend_DomにはZend_Dom_Queryクラスが実装されています。このZend_Dom_Queryを利用すれば、XML文書やHTML文書の内容に対してCSSセレクタやXPathでアクセスすることができます。例えば外部サービスから提供されたHTML文書を解析して、マッシュアップに利用したい場合などに威力を発揮します。
対象読者
PHPの基本構文は一通り理解しているが、フレームワークを利用したことはないという方を対象としています。
必要な環境
Zend FrameworkはPHP 5.1.4以降とWebサーバがインストールされている環境で利用可能です。本稿ではWebサーバとしてApache 2.2を、OSにWindows XPを採用し、アプリケーションを作成していきます。
以下に、今回アプリケーション作成/動作確認に用いた環境を示します(インストールにあたっては最新安定版の使用を推奨します)。各項目の詳細なインストール手順は、「サーバサイド技術の学び舎 - WINGS」より「サーバサイド環境構築設定手順」を参照ください。
- Windows XP SP2
- PHP 5.3.0
- Apache 2.2.11
LinuxやFreeBSDなどUNIX系OSをお使いの方もコマンドはほぼ一緒ですので、パスなどは適宜読み替えてください。
Zend_Dom_Query とは
 Zend_Dom_QueryはXML文書やHTML文書を解析し、その文書に対してCSSセレクタやXPathで内容にアクセスできるようにするクラスです。このような文書を解析する機能自体はPHPの拡張モジュールのSimpleXMLにも準備されていますが、これらのツールとZend_Dom_Queryが大きく違う点は、XPathだけでなく、CSSセレクタでも文書にアクセスできることです。
XPathもXMLにアクセスするためのクエリ言語としては標準的なものですが、CSSセレクタはスタイルシートを書くために利用するものなので、見慣れている方がさらに多いのではないかと思います。
 Zend_Dom_Queryは、もともとはMVCアプリケーションのテストを書くために設計されました。MVCアプリケーションから出力された結果が意図したとおりになるかを確認するためには、まずその出力された結果を解析しなければならないわけですが、そのために利用するわけです。
Zend_Dom_Query の処理の流れ
 Zend_Dom_Queryを利用した処理の流れは大きく3段階に分かれています(リスト1)。最初の段階は対象となる文書の指定と解析(リスト1の(1))、次の段階はその文書へのクエリ(リスト1の(2))、最後にクエリ結果の処理(リスト1の(3))となります。
... require_once 'Zend/Dom/Query.php'; //インスタンスの作成 $zend_dom_query = new Zend_Dom_Query(); //解析対象のHTML文書 $doc = <<<EOF
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Codezine テストページ</title> </head> <body> <h1>Zend_Dom_Query のテストページ</h1> <p class="normal"> <div id="main-ja">これはHTML文書です。</div> <div id="main-en">This is an HTML document.</div> </p> </body> </html>
EOF;
//(1) 文書の指定
$zend_dom_query->setDocument($doc);
//(2) クエリの実行
//  id が main である要素を探す
$results = $zend_dom_query->query("#main");
// (3)クエリ結果の利用
//   見つかった要素の内容を表示
foreach ($result as $domelement) {
  echo $domelement->nodeValue."\n";
}
▼
タグ:div これはHTMLドキュメントです。
(1)の文書の指定の段階では、XML/HTML文書が格納されている変数を渡します。ここでは文書の種類を自動判別するsetDocumentメソッドを利用して文書を指定しています。
(2)でCSSセレクタによって指定されたクエリを実行して、その結果を変数$resultsに格納しています。この$resultsはZend_Dom_Query_Resultクラスのインスタンスで、クエリにマッチしたDOM要素を格納しています。
(3)では、$resultsに格納された各要素を取り出して、その内容を表示しています。
 ここで、Zend_Dom_Queryのメソッドを紹介しておきます。
| 分類 | メソッド名 | 引数 | 説明 | 
| 文書の指定 | setDocument | $document | 文書$documentを与える。種別は自動的に判別する。 | 
| setDocumentHtml | $document | HTML形式の文書$documentを与える。 | |
| setDocumentXhtml | $document | XHTML形式の文書$documentを与える。 | |
| setDocumentXml | $document | XML形式の文書$documentを与える。 | |
| 文書の情報 | getDocument | (なし) | 格納されている文書を返す。 | 
| getDocumentType | (なし) | 格納されている文書の種別を返す。 | |
| クエリの実行 | query | $query | CSSセレクタで与えられたクエリ$queryを実行し、その結果をZend_Dom_Query_Resultクラスのインスタンスとして返す。 | 
| queryXpath | $xpathQuery | XPath形式で与えられたクエリ$xpathQueryを実行し、その結果をZend_Dom_Query_Resultクラスのインスタンスとして返す。 | 
それでは、それぞれの段階について詳しく見ていきましょう。
