[Zend Framework]Zend_Domを使ってみた
10月 10th, 2008 Posted in Zend Framework
Zend Framework 1.6から追加されたZend_Domを使ってみました。
XPathだけではなく、CSSセレクタによるDOMドキュメントの問い合わせを行うことができます。
以下のような感じでドキュメントを読み込ませてみました。
require_once 'Zend/Dom/Query.php'; $str =< << EOD <html> <body> <div id="title">title</div> <div class="list"> <ul> <li><a href="item_1.html">item 1</a></li> <li><a href="item_2.html">item 2</a></li> </ul> </div> </body> EOD; $zend_dom = new Zend_Dom_Query($str); echo "Document Type is "; echo $zend_dom->getDocumentType() . "\n"; echo "Document is \n"; echo $zend_dom->getDocument() . "\n";
結果は以下のとおりです。
Document Type is docHtml Document is <html> <body> <div id="title">title</div> <div class="list"> <ul> <li><a href="item_1.html">item 1</a></li> <li><a href="item_2.html">item 2</a></li> </ul> </div> </body> </html>
getDocumentType()でドキュメントのタイプが取得できます。
ドキュメントのタイプは、Xml、html、xhtmlの3タイプで判別されます。判別の方法は以下のようになっています。
public function setDocument($document) { if ('< ?xml' == substr(trim($document), 0, 5)) { return $this->setDocumentXml($document); } if (strstr($document, 'DTD XHTML')) { return $this->setDocumentXhtml($document); } return $this->setDocumentHtml($document); }
続いて、読み込んだドキュメントへの問い合わせをしてみます。
問い合わせの方法として、CSSセレクタの場合ははquery()メソッド、xpathの場合はqueryXpath()メソッドを使用します。
CSSセレクタ(query())の場合は、Zend_Dom_Query_Css2XpathクラスでCSSセレクタの表現をXPathに変換した後、queryXpath()の処理を行っています。
そして、queryXpath()メソッドはDOMXPathクラスのquery()メソッドを呼び出してドキュメントを解析しています。
Zend_Dom_Query_Resultオブジェクトが問い合わせの戻り値となります。
Zend_Dom_Query_ResultはIteratorとCountableを実装しているので、foeachでループさせたり、count()で要素数を取得できます。
$xpath = "//div[@class='list']/child::ul/child::li"; $result = $zend_dom->queryXpath($xpath); // $resultはZend_Dom_Query_Result echo "count " . count($result) . "\n"; foreach($result as $node) { // $nodeはDOMElement echo $node->nodeValue . "\n"; } $css = '#title'; $result = $zend_dom->query($css); echo "count " . count($result) . "\n"; foreach($result as $node) { echo $node->nodeValue . "\n"; }
結果は以下のようになります。
count 2 item 1 item 2 count 1 title
Zend_Dom_Query_Resultをforeachでループさせたときに取得できる値がDOMElementです。
DOMElementの扱い方がよくわからなかったので結構手間取ってしまいました。
One Response to “[Zend Framework]Zend_Domを使ってみた”
By twk on 10月 11, 2008
こんなの増えてたんだね。ためになったよ