犬ターネット

DOMXPath::query の結果にまた DOMXPath::query を実行したい

2014-09-02 php xpath

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 の式" );
}

もうすこし楽に処理したい...

甘いものは別腹
酒を頼むときに必ずウーロン茶を頼んで両方飲むっていう飲み方をしたんだけど、酷い酔い方しないし、数時間もすると酒が抜けるからすごくいいと思う