XPath查询有时不显示正确的元素

时间:2012-07-15 17:33:25

标签: php xpath

我正在使用XPath,这是我的查询:

$elements = $xpath->query('//div/div/div/div/div/div[@id="con1"]/table/tr/td');

一切正常。

然后我更改div中的条件,查询如下:

$elements = $xpath->query('//div/div/div/div/div/div[@id="con2"]/table/tr/td');

我确实看到了我必须看到的东西。

但后来,如果我这样做:

$elements = $xpath->query('//div/div/div/div/div/div[@id="con1" or @id="con2"]/table/tr/td');

我再次只看到con1的元素。那是为什么?

完整代码如下:

$elements = $xpath->query('//div/div/div/div/div/div[@id="con1" or @id="con2"]/table/tr/td');
foreach ( $elements as $element ) {
    $str1=$element->getAttribute('class');
    $str2="first-td";
    $str3="status";
    if (strcmp($str1,$str2)==0) {
        var_dump( $element->nodeValue);
    }
    if (strcmp($str1,$str3)==0) {
        echo $element->childNodes->item(0)->getAttribute('class'). "<br />"; 
    }
}

总结:如果我的条件仅为con1,我会看到正确的结果。如果它只是con2,我会看到正确的结果。当我使用or时会出现问题。在这种情况下,我只会从con1看到结果。就像它在完成第一个条件后停止了。它们与DOM树处于同一级别。

1 个答案:

答案 0 :(得分:0)

您要做的是在同一个表达式中检索<div id="con1"><div id="con2">,但您实际做的是检索 div 属性 id =“con1” id =“con2”。条件的第一个表达式返回true,然后获得<div id="con1">节点。这很有道理。

要获得两个节点,您需要以下内容:

//div[@id="con1"]|//div[@id="con2"

注意://div[@id="con1"]查找树中的任何节点<div id="con1">,文档中的id必须是唯一的。没有必要指定所有路径。