DOMXPath::__construct には DOMDocument を渡さなきゃならないから、以下はエラーになる。
<?php $dom = new \DOMDocument(); $dom->loadHTML( "<html>.... 略 ....</html>" ); $xpath = new \DOMXpath( $dom ); $nodes = $xpath->query( "xpath の式" ); foreach( $nodes as $node ) { // Catchable fatal error: Argument 1 passed to DOMXPath::__construct() must be an instance of DOMDocument... $_xpath = new \DOMXpath( $node ); $_nodes = $_xpath->query( "別の xpath の式" ); }
なので、ひと手間かけて DOMDocument を作ってやらなければいけない。
<?php $dom = new \DOMDocument(); $dom->loadHTML( "<html>.... 略 ....</html>" ); $xpath = new \DOMXpath( $dom ); $nodes = $xpath->query( "xpath の式" ); foreach( $nodes as $node ) { // ひと手間かけて $node を DOMDocument にする $tmp_dom = new \DOMDocument(); $cloned = $node->cloneNode( true ); $tmp_dom->appendChild( $tmp_dom->importNode( $cloned, true ) ); // これでOK $_xpath = new \DOMXpath( $tmp_dom ); $_nodes = $_xpath->query( "別の xpath の式" ); }
もうすこし楽に処理したい...