0

我正在尝试使用 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

4 回答 4

6

有没有更好的方法来编写查询,它允许我使用第一个示例之类的东西,忽略中间的元素并返回 TD?

可以写:

//table//td

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

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

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

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

/*/*/tr/td

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

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

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

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

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

(//td)[1]
于 2012-08-20T01:28:02.867 回答
1

哦,天哪,天哪,有一些不常见的东西。
至于您的第一个 xpath 查询,您可以只返回您想要的,但在标记名之前使用双 //

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

于 2012-08-20T01:11:18.103 回答
1

您正在寻找的是:

$finder->query('//table//td');
于 2012-08-20T01:15:30.503 回答
1

你也可以这样写:-

$finder->query('//td');
于 2012-08-20T01:18:32.187 回答