Life, Education, Death

プログラミング以外でも思ったことをつらつらと書きたい

DOM XMLでHTMLの一部だけを入力して一部だけ出力したい

という悩み。テンプレートとかを使っていると、完全でないHTMLを使いたくなる。

そこでDOMDocument::loadHTMLをして、saveXML(node)とするとnodeの部分が出力されるがHTML内のコメントアウトがCDATAになってしまう。(このせいでFirefoxでscriptタグが読めずJavascriptエラーが出てしまう。)


saveHTMLをするとhtmlとかbodyとかタグが補完されてしまっているので意味がない。


なのでどーするかというと

$html = file_get_contents(XXXX);
$doc = new DOMDocument('1.0', 'UTF-8');
$doc->loadHTML($html);

$newDoc = new DOMDocument();
foreach( $doc->getElementsByTagName("body")->item(0)->childNodes as $node ){
    $newDoc->appendChild( $newDoc->importNode($node, true) );
}
echo $newDoc->saveHTML();

新しいDOMDocumentを作って中身をコピーしたら出来た。
もっといい方法があれば、知りたいなと思うが、出来たからとりあえずいいかな。
※[]などの一部記号がURLエンコードされていたので出力時にURLエンコードをかけてもいいかもしれない