SimpleTag と SimpleXML->xpath の比較 (rev3115)

rhacoのSimpleTagとPHP5のSimpleXMLのxpathをちょっと比較。

今回はSimpleTag で、「center の子の div」
をさくっと書く方法が分かりませんでした。
もしかしたら見落としてるのかも・・・

<?php
require_once('./__init__.php');
Rhaco::import('tag.model.TemplateFormatter');
Rhaco::import('tag.model.SimpleTag');

$html = <<< __HD__
<center>
	<div id="aaa1"></div>
	<div id="aaa2"></div>
	<p>
		<div id="bbb"></div>
		<p>
			<div id="ccc"></div>
		</p>
	</p>
	<div id="ddd"></div>
</center>
__HD__;

$xml = new SimpleXMLElement($html);
SimpleTag::setof($tag, $html, 'center');

echo '<hr/>■div全部 <br/>';
dsp('SimpleXML', $xml->xpath('//div'));
dsp('SimpleTag', $tag->getIn('div'));

echo '<hr/>■id=ccc : center の唯一の子の p を取る <br/>';
dsp('SimpleXML', $xml->xpath('/center/p'));
dsp('SimpleTag', $tag->f('p'));

echo '<hr/>■id=ccc : center の唯一の子の p の唯一の子の p の唯一の子の div を取る <br/>';
dsp('SimpleXML', $xml->xpath('/center/p/p/div'));
dsp('SimpleTag', $tag->f('p.p.div'));

echo '<hr/>■id=aaa1,aaa2,ddd : center の子の div を取る <br/>';
dsp('SimpleXML', $xml->xpath('/center/div'));

// SimpleTagでは、こう書いても最初のdivのみとってくる仕様
dsp('SimpleTag', $tag->f('div'));

// ということで、無理やりパターン
dsp('SimpleTag', array_merge($tag->getIn('div', false, 0, 2), $tag->getIn('div', false, 4, 1)));

// いっそのこと、div全部とってきて、idで絞込みパターン
{
	$ans = array();
	foreach ($tag->getIn('div') as $item) {
		/* @var $item SimpleTag */
		$id = $item->getParameter('id');
		if (in_array($id, array('aaa1', 'aaa2', 'ddd'))) {
			$ans[] = $item;
		}
	}
	dsp('SimpleTag', $ans);
}

function dsp($label, $obj)
{
	echo '<pre style="border:solid 1px; margin:0.5em; padding:0.5em;">';
	echo 'Label:' . $label . '<br/>---<br/>';
	if (empty($obj)) {
		echo 'empty';
	} else if (!is_array($obj)) {
		$obj = array($obj);
	}
	foreach ($obj as $item) {
		_dsp($item);
	}
	echo '</pre>';
}

function _dsp($obj)
{
	if (Variable::istype('SimpleTag', $obj)) {
		/* @var $obj SimpleTag */
		$out = $obj->get();
	} else {
		/* @var $obj SimpleXMLElement */
		$out = $obj->asXML();
	}

	echo TemplateFormatter::htmlencode($out) . '<br/>';
}

?>

PHP5.2.2で実行した結果はこちら。

==================================================
■div全部

Label:SimpleXML
---
<div id="aaa1"/>
<div id="aaa2"/>
<div id="bbb"/>
<div id="ccc"/>
<div id="ddd"/>

Label:SimpleTag
---
<div id="aaa1" />
<div id="aaa2" />
<div id="bbb" />
<div id="ccc" />
<div id="ddd" />

==================================================
■id=ccc : center の唯一の子の p を取る

Label:SimpleXML
---
<p>
		<div id="bbb"/>
		<p>
			<div id="ccc"/>
		</p>
	</p>

Label:SimpleTag
---
<p>
		<div id="bbb"></div>
		<p>
			<div id="ccc"></div>
		</p>
	</p>

==================================================
■id=ccc : center の唯一の子の p の唯一の子の p の唯一の子の div を取る

Label:SimpleXML
---
<div id="ccc"/>

Label:SimpleTag
---
<div id="ccc" />

==================================================
■id=aaa1,aaa2,ddd : center の子の div を取る

Label:SimpleXML
---
<div id="aaa1"/>
<div id="aaa2"/>
<div id="ddd"/>

Label:SimpleTag
---
<div id="aaa1" />

Label:SimpleTag
---
<div id="aaa1" />
<div id="aaa2" />
<div id="ddd" />

Label:SimpleTag
---
<div id="aaa1" />
<div id="aaa2" />
<div id="ddd" />