2014-09-29 74 views
1

我正在使用PHP的DOMDocument的xPath函数。带有可选子元素的xPath(如果存在,应返回)

比方说,我有以下的HTML(来说明我的问题):

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

第一行始终可用,但在某些情况下,“newPrice级”是在HTML。

我使用了这个xPath-expression,但即使存在另一个,也总是返回'price-class'。当'newPrice'级别出现时,我只想要这个价值。如果它不存在,那么我想要'价格'级的价值。

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

我该如何做到这一点?有任何想法吗?

回答

3

这或许有助于制定不同的条件:

要选择与class="price"<span>元素如果没有,则与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 
+0

是啊,这是更好的 – Ghost 2014-10-12 13:08:08

+0

感谢这个好书面回答! – RayK 2017-10-20 12:31:22

相关问题