使用Xpath访问桌子上的孩子

时间:2012-08-20 01:08:15

标签: php dom xpath

我正在尝试使用XPath

访问Dom的特定元素

这是一个例子

<table>
<tbody>
    <tr>
        <td>
            <b>1</b> <a href="http://www.url.html">data</a><br>
            <b>2</b> <a href="http://www.url.html">data</a><br>
            <b>3</b> <a href="http://www.url.html">data</a><br>
        </td>
    </tr>
</tbody>
</table>

我想定位“table td”,所以我在Xpath中的查询类似于

$finder->query('//table/td');

只有这不会将td作为子子项返回,并且使用

进行直接访问
$finder->query('//tr/td');

有没有更好的方法来编写查询,这将允许我使用类似第一个示例忽略中间元素并返回TD的内容?

4 个答案:

答案 0 :(得分:5)

  

是否有更好的方法来编写允许我使用的查询   像第一个例子那样忽略中间和之间的元素   返回TD?

可以写:

//table//td

然而,这真的“更好”吗?

在许多情况下,对XPath 伪运算符 //的评估可能导致显着的低效率,因为它会导致遍历上下文节点的整个子树被遍历。

每当静态知道所需节点的路径时,用特定的已知路径替换任何//可能更有效,从而避免完整的子树遍历。

对于提供的XML文档,此类表达式为

/*/*/tr/td

如果有多个table元素,每个元素都是top元素的子元素,我们只想选择forst td的{​​{1}},这是一个很好的特定表达式是:

table

如果我们只想选择同一文档中第一个/*/table[1]/*/tr/td 的第一个td ,最好这样做:

table

或者如果我们想要选择XML文档中的第一个(/*/table[1]/*/tr//td)[1] (事先不知道它的结构),那么我们可以指定:

td

答案 1 :(得分:1)

哦,男孩哦,男孩,经常看不到的东西  至于你的第一个xpath查询,你可以只返回你想要的,但在标记名之前使用double // on

但是,我不明白为什么你不只是想通过标记名来获取td ...

答案 2 :(得分:1)

您正在寻找的是:

$finder->query('//table//td');

答案 3 :(得分:1)

您也可以这样写: -

$finder->query('//td');