使用Xpath访问桌子上的孩子

Ste*_*hen 0 php xpath dom

我试图使用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>
Run Code Online (Sandbox Code Playgroud)

我想以"table td"为目标,所以我在Xpath中的查询是这样的

$finder->query('//table/td');
Run Code Online (Sandbox Code Playgroud)

只有这不会返回td作为子子,并且将使用直接访问

$finder->query('//tr/td');
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法来编写查询,这将允许我使用像第一个例子忽略中间元素并返回TD的东西?

Dim*_*hev 6

是否有更好的方法来编写查询,这将允许我使用像第一个例子忽略中间元素并返回TD的东西?

可以写:

//table//td
Run Code Online (Sandbox Code Playgroud)

但是,这真的"更好"吗?

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

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

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

/*/*/tr/td
Run Code Online (Sandbox Code Playgroud)

如果有多个table元素,每个元素都是top元素的子元素,并且我们只想选择tdforst 的s,那么table一个好的特定表达式是:

/*/table[1]/*/tr/td
Run Code Online (Sandbox Code Playgroud)

如果我们只想在同一文档中选择第一个td中的第一个table,那么执行此操作的好方法是:

(/*/table[1]/*/tr//td)[1]
Run Code Online (Sandbox Code Playgroud)

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

(//td)[1]
Run Code Online (Sandbox Code Playgroud)