PHPの getElementById を正常に動作させる

  • PHP
  • 現在地

load メソッドで読み込んだHTMLファイルをDOM操作をしようと思い、getElementById メソッドを使ってIDから要素を取得しようとしたのですが、何やらうまく動作してくれませんでした。

今回は、これを何とかしてみたので記述しておきます。

PHPでの getElementById メソッド

どうやらPHPの getElementById メソッドは、DOMElement クラスの setIdAttribute メソッドでID属性を指定しておくか、DTDでID型の属性を定義し、DOMDocument::validate あるいは DOMDocument::$validateOnParse でドキュメントを検証しておかないと、正常に動作しないようです。

外部リンク : PHP: DOMDocument::getElementById - Manual

つまりPHPの getElementById はIDとして定義された何らかの属性の値から検索を行うので、あらかじめIDを定義しておく必要があるわけです。

ということで getElementById を使用する前に、すべての要素にIDとする属性を持つ場合に setIdAttribute で設定することにしてみました。

DTDで定義して検証する場合、DOCTYPEしかないHTML5や検証がうまくいかないXHTMLでは、DOMImplementation クラスからDTDを作成する必要がありそうなので、これは面倒くさそうで試してないです。

全要素で特定の属性をIDとして設定する

下記の関数 setId() では、foreach と再起処理で全ての要素でIDとしたい属性を持っているか確認し、あればIDとして設定を行います。

setId() に渡す引数は、ドキュメントオブジェクトとなります。

2012年05月27日
引数にいちいち documentElement を送るようにしていたのですが、ドキュメントオブジェクトだけで済むように修正しました。

// 関数
  • function setId($e){
    • foreach($e->childNodes as $child){
      • if($child->hasAttributes()){
        • if($child->hasAttribute('id')){
          • $child->setIdAttribute('id',true);
        • }
      • }
      • if($child->hasChildNodes()){
        • setId($child);
      • }
    • }
  • }// 全IDの設定
// 使用するまでの一例
  • $dom = new DOMDocument();
  • $dom->loadXML('<html><head></head><body><p>ここは表示されない。</p><p id="abc">成功。</p></body></html>');
  • setId($dom);
  • echo $dom->getElementById('abc')->nodeValue;

この一例では、getElementById で取得した要素の値を呼び出しているので、「成功。」とだけ表示されるはずです。

ちなみに、上のコードはHTMLの id 属性をIDとして設定する場合ですが、setIdAttribute の値を書き換えれば、他の属性もIDとすることもできるので、試してみて下さい。(その場合は、hasAttribute の値も同様に。)

スポンサードリンク

inserted by FC2 system