我正在尝试使用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
元素,每个元素都是顶部元素的子元素,并且我们只想选择第一个table
的td
s,一个好的、具体的表达式是:
/*/table[1]/*/tr/td
如果我们只想在同一文档中选择第一个table
中的第一个td
,一个很好的方法是:
(/*/table[1]/*/tr//td)[1]
或者,如果我们想选择XML文档中的第一个td
(事先不知道其结构),那么我们可以指定:
(//td)[1]
您要查找的是:
$finder->query('//table//td');
哦,天哪,有什么不常看到的东西
对于您的第一个xpath查询,您可以只返回您想要的内容,但在标记名
之前使用双//
但是,我不明白为什么你不想只通过标记名获取td。。。
您也可以这样写:-
$finder->query('//td');