DomDocument->get_element_by_id使用時の注意

ページ情報
制作日
2004-02-11
最終更新日
2004-02-11
参照用URI
http://www.arielworks.net/articles/2004/0211a
分野

PHPのヘルプには書いて無いが、DomDocument->get_element_by_idの使用には一種の制限がある。

これはPHPではなく大元のDOMの仕様によるものでDTDでのデータ型が「ID」の属性のみがIDとして扱われる(逆に言えばデータ型が「ID」ならば属性の名前が「id」である必要はない)。そのためDOCTYPE宣言の存在しないXML文章ではget_element_by_idは一切反応しない。

The DOM implementation must have information that says which attributes are of type ID. Attributes with the name "ID" are not of type ID unless so defined. Implementations that do not know whether attributes are of type ID or not are expected to return null.

1. Document Object Model Core(W3C:1. Document Object Model Core)』より引用。

どうしてもこのメソッドが使いたい場合はXML宣言の後に以下のようなコードを追加する必要がある。

<!DOCTYPE root [ 
<!ATTLIST element id ID #IMPLIED>
]>

rootとelementは必要に応じて変える必要がある。きちんとDTDを作っていた場合は簡単に対応できるだろう。XHTMLを操作するときはXHTMLのDTDを外部参照するのが早いかもしれない(外部参照が可能かどうかは試していないが)。

もし単純にid属性に特定の値を持つ要素を検索したいのならば上記の方法よりもXpathを使った方法の方が早くて簡単だ。

$dom = domxml_open_mem('<root><el id="one">ONE</el><el>TWO</el></root>');
$xpath = $dom->xpath_new_context();
$temp_one = $xpath->xpath_eval('//*[@id="one"]');
$one = $temp_one->nodeset[0];

DOM関係の関数、メソッドは現時点では全体的にマニュアルが整備されていないので使用する場合はDOMの仕様書を参考にした方が良いと言える。特に取り得る引数の数に関してPHPのマニュアルは当てにならないので注意した方がよい。

連絡先、リンク、転載や複製などについては「サイト案内」をご覧ください。Powered by HIMMEL