带有可选子元素的xPath(如果存在则应返回)

时间:2014-09-29 14:34:43

标签: php xpath domxpath

我正在使用PHP的DOMDocument的xPath函数。

让我们说,我有下面的HTML(以说明我的问题):

<span class="price">$5.000,00</span>
<span class="newPrice">$4.000,00</span>

第一行始终可用,但在某些情况下,&#39; newPrice-class&#39;在HTML中。

我使用了这个xPath表达式,但是即使另一个存在,它总是会返回&#39; price-class&#39;当“新价格”类存在时,我只想要该值。如果它不存在,那么我想要&#39; price&#39; -class值。

//span[@class='price'] | //[span[@class='newPrice']

我怎样才能做到这一点?有什么想法吗?

1 个答案:

答案 0 :(得分:4)

或许有助于以不同方式制定条件:

如果<span>没有class="price"元素,则只需class="newPrice" 选择否则您想要class="newPrice"

//span[(not(//span[@class="newPrice"]) and @class="price") or @class="newPrice"]

此Xpath表达式将返回您要查找的元素。

解释:第一个条件可以在谓词中写成以下内容:

not(//span[@class="newPrice"]) and @class="price"

第二个条件就像你已经拥有它一样:

@class="newPrice"

使用正确的括号,您可以将其与or运算符结合使用:

//span[
  (
     not(//span[@class="newPrice"]) 
     and @class="price"
  ) 
  or 
  @class="newPrice"
]

并且由于您希望以字符串形式获取价格值,因此它在PHP示例代码中的外观如下:

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);

$expression = 'string(//span[(not(//span[@class="newPrice"]) and @class="price") or @class="newPrice"])';

echo "your price: ", $xpath->evaluate($expression), "\n";

输出:

your price: $4.000,00