Wadslog

[Zend Framework]Zend_Domを使ってみた

Oct 10, 2008

Zend Framework 1.6から追加されたZend_Domを使ってみました。 XPathだけではなく、CSSセレクタによるDOMドキュメントの問い合わせを行うことができます。 以下のような感じでドキュメントを読み込ませてみました。``` require_once ‘Zend/Dom/Query.php’;

$str =< « EOD

title

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

title

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

comments powered by Disqus