php DomXPath - 如何仅在当前节点中获取图像而不在子节点中?

时间:2011-08-15 00:25:21

标签: php domxpath

我只需要获取当前节点中的图像而不是子节点中的图像 我想只获得没有green/yellow/red/black图片的not_important.gif张图片 我可以使用查询'.//table/tr/td/img'
但我需要在循环内部

<?php
    /////////////////////////////////////////////////////////////////////
        $html='
            <table>
                <tr>
                    <td colspan="2">
                        <span>
                            <img src="not_important.gif" />
                        </span>
                        <img src="green.gif" />
                    </td>
                </tr>
                <tr>
                    <td>
                        <span>yellow</span>
                        <img src="yellow.gif" />
                    </td>
                    <td>
                        <span>red</span>
                        <img src="red.gif" />
                    </td>
                </tr>
            </table>
            <table>
                <tr>
                    <td>
                        <span>
                            <img src="not_important.gif" />
                        </span>
                        <img src="black.gif" />
                    </td>
                </tr>
            </table>
        ';
    /////////////////////////////////////////////////////////////////////
        $dom = new DOMDocument();
        $dom->loadHTML($html);
        $xpath = new DomXPath($dom);
    /////////////////////////////////////////////////////////////////////
        $query = $xpath->query('.//table/tr/td');
        for( $x=0,$results=''; $x<$query->length; $x++ )
        {
            $x1=$x+1;

            $image = $query->item($x)->getELementsByTagName('img')->item(0)->getAttribute('src');

            $results .= "image $x1 is : $image<br/>";
        }
        echo $results;
    /////////////////////////////////////////////////////////////////////
?>

我可以通过$query->item()->执行此操作 我尝试了has_attributesgetElementsByTagNameNS以及getElementById 但我失败了::

2 个答案:

答案 0 :(得分:4)

替换:

$image = $query->item($x)->getELementsByTagName('img')->item(0)->getAttribute('src');

...与:

$td = $query->item($x); // grab the td element
$img = $xpath->query('./img',$td)->item(0); // grab the first direct img child element
$image = $img->getAttribute('src'); // grab the source of the image

换句话说,再次使用XPath对象查询,但现在用于./img,相对于您提供的上下文节点query()的第二个参数。上下文节点是早期结果的元素之一(td)。

答案 1 :(得分:1)

查询//table/tr/td/img应该可以正常工作,因为不需要的图片都位于<span>元素中。

你的循环看起来像

$images = $xpath->query('//table/tr/td/img');
$results = '';
for ($i = 0; $i < $images->length; $i++) {
    $results .= sprintf('image %d is: %s<br />',
                        $i + 1,
                        $images->item($i)->getAttribute('src'));
}