Xpath是一种表达式语言,常被用于web程序,用以在XML/HTML文档中选择节点。虽然用XPath选择节点远比CSS selectors复杂,但它却无比强大、功能丰富。

Symfony通过DomCrawler组件对XPath提供了支持,该组件一般被用于测试时验证给定响应的内容与预期相匹配。在Symfony 3.2中我们通过添加对评估(evaluate)XPath表达式的支持,改进了对XPath的整合。

实践中,这意味着你可以对由XPath获取的信息进行高级预处理以简化你的测试代码。对下面的HTML代码进行思考:

1
2
3
4
5
6
7
$html = '<html>
<body>
    <span id="article-100" class="article">Article 1</span>
    <span id="article-101" class="article">Article 2</span>
    <span id="article-102" class="article">Article 3</span>
</body>
</html>';

使用substring-after()这个Xpath函数,你可以得到每个节点之id属性的数字部分:

1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\DomCrawler\Crawler;
 
$crawler = new Crawler();
$crawler->addHtmlContent($html);
 
$ids = $crawler->filterXPath('//span[contains(@id, "article-")]')
               ->evaluate('substring-after(@id, "-")');
// $ids = array:3 [
//   0 => "100"
//   1 => "101"
//   2 => "102"
// ]

使用count() Xpath函数,如下例,你可以得到包含.article CSS类的<span>元素的数量:

1
2
3
4
5
6
7
8
9
use Symfony\Component\DomCrawler\Crawler;
 
$crawler = new Crawler();
$crawler->addHtmlContent($html);
 
$num = $crawler->evaluate('count(//span[@class="article"])');
// $num = array:1 [
//   0 => 3.0
// ]

阅读MDN Xpath function reference可以快速了解所有可用函数的用法,另外对于W3C官方的推荐内容可参考Xpath and XQuery Functions文档。