使用Xpath访问表上的子项


Access child on a table using 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>

我想以"表td"为目标,所以我在Xpath中的查询有点像

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

只是这不会将td作为其子级返回,直接访问将使用完成

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

有没有更好的方法来编写查询,让我可以使用类似第一个例子的方法来忽略中间的元素并返回TD?

有没有更好的方法来编写查询,使我可以使用类似于第一个例子,忽略和之间的元素返回TD?

可以写入:

//table//td

然而,这真的"更好"吗

在许多情况下,XPath伪运算符//的求值可能会导致显著的低效率,因为它会导致遍历植根于上下文节点的整个子树。

只要到所需节点的路径是静态已知的,那么用特定的已知路径替换任何//可能会更有效,从而避免完整的子树遍历。

对于所提供的XML文档,这样的表达式是

/*/*/tr/td

如果有多个table元素,每个元素都是顶部元素的子元素,并且我们只想选择第一个tabletds,一个好的、具体的表达式是:

/*/table[1]/*/tr/td

如果我们只想在同一文档中选择第一个table中的第一个td,一个很好的方法是:

(/*/table[1]/*/tr//td)[1]

或者,如果我们想选择XML文档中的第一个td(事先不知道其结构),那么我们可以指定:

(//td)[1]

您要查找的是:

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

哦,天哪,有什么不常看到的东西
对于您的第一个xpath查询,您可以只返回您想要的内容,但在标记名
之前使用双//

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

您也可以这样写:-

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