いろいろ準備中

[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の扱い方がよくわからなかったので結構手間取ってしまいました。

  1. One Response to “[Zend Framework]Zend_Domを使ってみた”

  2. By twk on 10月 11, 2008

    こんなの増えてたんだね。ためになったよ :-)

コメントを投稿する