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