在xpath查询中使用not

时间:2014-12-09 07:06:03

标签: php xpath

我从我正在使用XPath的站点获取特定数据但是为此我必须排除几个我必须使用NOT的变量。但这不是代码中的工作,请解释我必须做些什么才能使它工作:

继承了html代码

<tr><td colspan="2" valign="top" align="left"><span class="tl-document">
<left>some text here
</left>
</span></td></tr>
<tr><td colspan="2" valign="top" align="left">
<span class="text-id">some text here,<sup>a</sup><sup>b</sup></span>
<span class="text-id">some text here,<sup>a</sup></span>
</td></tr>
<tr><td colspan="2" valign="top" class="right">
<sup>a</sup>some text here<br>
</td></tr>
<tr><td colspan="2" valign="top" class="right">
<sup>b</sup>some text here<br>
</td></tr>
<td colspan="2" valign="top">
<br><div>
<span class="tl-default">Objective</span>
<p>some text here,</p>
</div>
<div>
<span class="tl-default">Methods</span>
<p>some text here,</p>
</div>
<div>
</td>
<td colspan="2" valign="top">
<br><div>
<span class="tl-default">Objective</span>
<p>some text here,</p>
</div>
</td>

尝试仅获取不包含类的td并对齐,为此我将此方法用于我的xpath:

$getnew="http://www.example.com/;
$html = new DOMDocument();
@$html->loadHtmlFile($getnew);
$xpath = new DOMXPath( $html );
$y = $xpath->query('//td[@colspan="2" and valign="top" and (not(@class and @align))]');
$ycnt = $y->length;
for ( $idf=6; $idf<$ycnt; $idf++) 
{ if($idf==6){
  echo "<p class='artbox'>".$y->item($idf)->nodeValue."</p>";}
}

我是新手,所以请提出您的意见

1 个答案:

答案 0 :(得分:0)

您的逻辑问题是,没有任何元素同时包含@class @align,因此not()将始终产生true。< / p>

相反,您应该排除具有以下属性的元素:

//td[@colspan="2" and @valign="top" and not(@class or @align)]

或者,要匹配仅包含这两个属性的元素,您可以添加count()条件:

//td[@colspan="2" and @valign="top" and count(@*)=2]

更新

$query = '//td[@colspan="2" and @valign="top" and not(@class or @align)]';
foreach ($xpath->query($query) as $node) {
    // do something with $node
}