SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend Framework入門

PHPアプリからCSSセレクタでHTML/XML文書を解析する - Zend_Dom -

Zend Frameworkによる実践的なPHPアプリケーション開発 22

クエリの実行

 Zend_Dom_QueryはCSSセレクタで記述されたクエリとXPathで記述されたクエリの、2通りの方法で文書へのクエリを行うことができ、それぞれZend_Dom_QueryのqueryメソッドとqueryXpathメソッドで利用することができます。

CSSセレクタによるクエリ

 Zend_Dom_QueryできるCSSセレクタは、CSS1とCSS2のものの一部になります。

Zend_Dom_Queryで利用できるCSSセレクタ
分類 種類 説明 記述
クラスやIDなどで指定
 
 
タイプセレクタ タグ名によって選択 「(タグ名)」
クラスセレクタ 要素のクラス属性によって選択 「.(クラス名)」ないし
「(タグ名).(クラス名)」
IDセレクタ 要素のIDで選択 「#(ID)」ないし
「(タグ名)#(ID)」
属性で指定
 
 
完全一致 属性の値と指定された値が完全一致した場合に選択 「(タグ名)[(属性名)="(値)"]」
単語一致 属性の値に含まれる単語と指定された単語が一致した場合に選択 「(タグ名)[(属性名)~="(値)"]」
部分一致 属性と値の一部に指定された値が含まれる場合に選択 「(タグ名)[(属性名)*="(値)"]」
文脈で指定
 
子要素セレクタ セレクタを組み合わせるためのセレクタで、直接の親子関係にある要素を選択 「(親要素を選ぶセレクタ)>(子要素を選ぶセレクタ)」
子孫セレクタ セレクタを組み合わせるためのセレクタで、先祖・子孫の関係にある要素を選択 「(先祖を選ぶセレクタ)
(子孫を選ぶセレクタ)」

 これらのCSSセレクタを利用した例をリスト4に示します。

[リスト4]CSSセレクタの例(サンプルのxml.phpより)
$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_QueryqueryXpathメソッドを使います。例えば「owner属性がcodezineであるbook要素の子孫で、種類がtitleである要素」をXPathで記述すると「//book[@owner="codezine"]//title」となります(なお、XPathの説明はこの記事の範囲を越えてしまいますので、W3Cのドキュメントなどを参照してください)。

 これをクエリする例をリスト5に示します。

[リスト5]XPathの例(サンプルのxpath.phpより)
// XPathによるクエリ
//owner属性がcodezineであるbook要素の 子要素で、
//  title要素を指定
$xpath_query = '//book[@owner="codezine"]//title';

// クエリの実行
$results = $zend_dom_query->queryXpath($xpath_query);

 このように、CSSセレクタを利用してクエリを行うのと同じようにXPathを利用してクエリを行うことができます。

次のページ
クエリ結果の利用

この記事は参考になりましたか?

Zend Framework入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 風田 伸之(カゼタ ノブユキ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4162 2009/08/07 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー