クエリの実行
Zend_Dom_QueryはCSSセレクタで記述されたクエリとXPathで記述されたクエリの、2通りの方法で文書へのクエリを行うことができ、それぞれZend_Dom_QueryのqueryメソッドとqueryXpathメソッドで利用することができます。
CSSセレクタによるクエリ
Zend_Dom_QueryできるCSSセレクタは、CSS1とCSS2のものの一部になります。
| 分類 | 種類 | 説明 | 記述 |
| クラスやIDなどで指定 |
タイプセレクタ | タグ名によって選択 | 「(タグ名)」 |
| クラスセレクタ | 要素のクラス属性によって選択 | 「.(クラス名)」ないし 「(タグ名).(クラス名)」 |
|
| IDセレクタ | 要素のIDで選択 | 「#(ID)」ないし 「(タグ名)#(ID)」 |
|
| 属性で指定 |
完全一致 | 属性の値と指定された値が完全一致した場合に選択 | 「(タグ名)[(属性名)="(値)"]」 |
| 単語一致 | 属性の値に含まれる単語と指定された単語が一致した場合に選択 | 「(タグ名)[(属性名)~="(値)"]」 | |
| 部分一致 | 属性と値の一部に指定された値が含まれる場合に選択 | 「(タグ名)[(属性名)*="(値)"]」 | |
| 文脈で指定 |
子要素セレクタ | セレクタを組み合わせるためのセレクタで、直接の親子関係にある要素を選択 | 「(親要素を選ぶセレクタ)>(子要素を選ぶセレクタ)」 |
| 子孫セレクタ | セレクタを組み合わせるためのセレクタで、先祖・子孫の関係にある要素を選択 | 「(先祖を選ぶセレクタ) (子孫を選ぶセレクタ)」 |
これらのCSSセレクタを利用した例をリスト4に示します。
$doc = <<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<bookList>
<book id="zend_dom_book" owner="realcoder ZF">
<title>よく分かるZend_Dom</title>
<type>技術書</type>
</book>
<book owner="codezine ZF">
<title>漫画でよく分かるZend_Dom</title>
<type>漫画</type>
</book>
<book owner="codezine" class="good_book">
<title>謎のメソッドと踊るZend_Dom</title>
<type>ライトノベル</type>
</book>
</bookList>
EOF;
...
// (1)タグ名
// (<type>要素を取得)
$results = $zend_dom_query->query('type');
// (2)クラスセレクタ
// (クラスが「good_book」である要素を取得)
$results = $zend_dom_query->query('.good_book');
// (3)IDセレクタ
// (IDが「zend_dom_book」である要素を取得)
$results = $zend_dom_query->query('#zend_dom_book');
// (4)属性 完全一致
// (<book>要素で、「owner」属性が「codezine」に一致する要素を取得)
$results = $zend_dom_query->query('book[owner="codezine"]');
// (5)属性 単語一致
// (<book>要素で、「owner」属性に「codezine」という単語を含む要素を取得)
$results = $zend_dom_query->query('book[owner~="codezine"]');
// (6)属性 部分一致
// (<book>要素で、「owner」属性に「code」を一部でも含む要素を取得)
$results = $zend_dom_query->query('book[owner*="code"]');
// (7)子要素セレクタ
// (<book>要素の直接の子である<title>要素を取得)
$results = $zend_dom_query->query('book>title');
// (8)子孫セレクタ
// (<bookList>要素の子孫である<type>要素を取得)
$results = $zend_dom_query->query('bookList type');
(1)~(3)はそれぞれ、「タイプセレクタ」「クラスセレクタ」「IDセレクタ」の例です。それぞれ、指定されたセレクタにマッチするすべての要素を選びます。
(4)~(6)は属性を指定するタイプのセレクタです。これらには「タグ名(例の中ではbook)を省略したり、ワイルドカードを指定したりすることはできない」「タグ名には英数字、-(ハイフン)と_(アンダースコア)しか使用できない」「値を指定する部分は引用符で囲う必要がある」といった制限がありますので注意してください。
(7)と(8)は複数のセレクタを利用して、入れ子構造になっている要素を選択する例です。(7)の例はbook要素の直下にtitle要素が組合せを選択するセレクタです。このセレクタ内の「>」の前後にスペースなどが入るとエラーになるので注意してください。
XPathによるクエリ
XPathによるクエリはZend_Dom_QueryのqueryXpathメソッドを使います。例えば「owner属性がcodezineであるbook要素の子孫で、種類がtitleである要素」をXPathで記述すると「//book[@owner="codezine"]//title」となります(なお、XPathの説明はこの記事の範囲を越えてしまいますので、W3Cのドキュメントなどを参照してください)。
これをクエリする例をリスト5に示します。
// XPathによるクエリ
//owner属性がcodezineであるbook要素の 子要素で、
// title要素を指定
$xpath_query = '//book[@owner="codezine"]//title';
// クエリの実行
$results = $zend_dom_query->queryXpath($xpath_query);
このように、CSSセレクタを利用してクエリを行うのと同じようにXPathを利用してクエリを行うことができます。
