2016.09.02
【PHP】DOMDocumentの使い方メモ
いつもある程度まで動かして忘れるのでメモをとっておく。
まずはライブラリが使えるようになっているかの確認。
以下のソースがエラーもなく動けば問題ない。
$dom = new DOMDocument();
DOMDocumentがないとか言われる時もあり、その時は環境を整えていかないといけない。
DOMDocumentは普通にソースからコンパイルすれば無理にはずさない限りは有効とのこと。
しかし、yumとかから入れた場合はphpの最小構成であとから自分で追加していかないといけないみたい。
これも、yum内にパッケージとしてあると思うので(php-xml)インストールしてみて再度実行すれば
エラーもなく実行できるのではないかと思う。
リファレンスとしては以下のものから追っていけば全部の情報へアクセスできる。
Link:PHP: DOMDocument - Manual
・読み込み
DOMDocumentを新規作成してそこにload系のメソッドを呼び出せばよい。
URLとか文字列からの読み込みもいろいろあるので使い勝手のいいものを選ぶと良い。
load系のコマンドはいろいろとエラーを吐き出すので@をつけて止めておいたほうがよさげ。
$dom = new DOMDocument(); @$dom->loadHTML( $html );
・ノード探索
DOMDocumentはDOMNodeの継承となる。
DOMDocument自体がノードでありルートという取り扱いになる。
子を持っているかはメソッドのhasChildNodes()で確認可能。
実体は変数childNodesにある。
ノードの名前はnodeNameで取れる。
DOMDocumentに付いている子ノードを引っ張り出すには以下のようにする。
if( $dom->hasChildNodes() ) { for( $i = 0; $i < $dom->childNodes->length; $i++ ) { $child = $dom->childNodes->item( $i ); echo $child->nodeName."\n"; } }
あとは、これをDOMNodeで再帰化すればどこまででもいけます。
子ノードがないところへのchildNodesへのアクセスはエラーになるので
アクセスする前に確認が必要。
ノードにもいろいろと種類があります。
DOMNode->nodeTypeで状況に応じて対応が必要かと思います。
詳しくは以下を参照
Link:PHP: DOMNode - Manual
Link:PHP: DOMNodeList - Manual
・属性
各ノードについている属性もDOMNodeが持っている。
ノードと同じくメソッドhasAttributes()で存在確認できれば
DOMNode->attributesに情報が入っている。
属性のリストはDOMNamedNodeMapで作成されています。
Link:PHP: DOMNamedNodeMap - Manual
手順的にはノードと同じですが、属性名を指定して取り出せるものもある。
属性を取得してもDOMNodeがかえってくる。
属性の値はDOMNode->nodeValueに入っている。
以下、aタグを意識してURLを取得してみる。
if( $node->hasAttributes() ) { $attr = $node->getNamedItem( "href" ); echo 'URL:'.$attr->nodeValue."\n"; }
こういうのを毎回調べて使って忘れるのパターン。
しっかりと忘れず覚えられたらいいんだけどね。
関連記事