文書の読み込み
解析対象の文書の指定するには 2つの方法があります。1つ目の方法はリスト1のようにsetDocument系のメソッドを使う方法で、もう一つはコンストラクタで指定する方法です(リスト2)。
... //$doc には HTML文書が格納されているとする //下の 3つはすべて同じ //(1)インスタンスの作成時に $zend_dom_query1 = new Zend_Dom_Query($doc); //(2)自動的に判別 $zend_dom_query2 = new Zend_Dom_Query(); $zend_dom_query2->setDocument($doc) //(3)HTML文書と指定 $zend_dom_query3 = new Zend_Dom_Query(); $zend_dom_query3->setDocumentHtml($html_doc)
このうち、setDocument系のメソッドを利用して文書を指定する方法には文書の種類を自動的に判別する方法(リスト2の(2))と、文書の種類を明示的に指定する方法(リスト2の(3))の2つがあります。XMLとして文書を読み込む場合にはXMLとして妥当でない文書を指定した場合には解析の段階で失敗します。一方でHTML文書の場合は、HTMLとしての妥当性はチェックしません。
通常の利用では自動判別の関数で十分だと思いますが、判別に失敗する場合や、XMLとして妥当でない文書を無理矢理読み込ませたい場合には明示的に文書の種類を指定するメソッドを利用する必要があります(後者の場合にはsetDocumentHtmlメソッドを利用)。
コンストラクタを利用したり、setDocumentメソッドを利用したりした場合は、文書の種類は自動的に判別されます。では、これはどう行われているのでしょう?
この仕組みは非常に簡単で、setDocumentメソッド内で、
- 「<?xml」からはじまる文書であれば XML文書
- それ以外で「DTD XHTML」という文字列が含まれる文書であればXHTML文書
- それ以外の場合はHTML文書
のように判別されます。
ちなみに、XHTML文書とHTML文書はほぼ同じように処理されます。
文字コード
このようなモジュールを利用する上でよく問題になるのが文字コードですが、Zend_Dom_Queryではどのように処理しているのでしょうか? 結論を先に述べると「きちんと作法に従った文書」に対しては「文字コードを自動的に判別」してくれます。
きちんと作法に従っている例をリスト3に示します。
//(1)HTML文書の場合(サンプルのzend_dom.php より) ... $doc = <<<EOF <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> ... //(2)XML文書の場合(サンプルのxml.php より) ... $doc = <<<EOF <?xml version="1.0" encoding="UTF-8"?> <bookList> ...
このように、HTMLの場合にはmetaタグで(リスト3の(1))、XMLの場合には先頭の宣言で(リスト3の(2))文字コードが正しく宣言されている文書については自動的に文字コードを判別して正しく処理してくれます。
逆に、このような宣言がない文書については文字コードを正しく判別してくれません(デフォルトではヨーロッパ言語の文字列として処理されてしまうようです)。日本語が含まれた文書について、クエリがうまく行かなかったり、文字化けをしてしまう場合には文字コードを疑ってみると良いでしょう。
