我试图使用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的东西?
是否有更好的方法来编写查询,这将允许我使用像第一个例子忽略中间元素并返回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)