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" />