PHP:如何检查节点是否存在以及是否使用xpath?

时间:2012-03-29 03:20:00

标签: php xml xpath

我正在查询Alexa以获得给定网址的排名。返回是XML格式。大多数情况下,Alexa会返回包含REACH& RANK值,虽然有时它没有。如果没有,下面的代码获取RANK的值会引发错误:

致命错误:在非对象上调用成员函数xpath()...

// Alexa Ranking
$url = 'http://data.alexa.com/data?cli=10&dat=s&url=' . $final_site;
$ch = curl_init(); // initialize curl handle
curl_setopt($ch, CURLOPT_URL,$url); // set url to post to
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
curl_setopt($ch, CURLOPT_TIMEOUT, 4); // times out after 4s
$result = curl_exec($ch); // run the whole process
$xml = simplexml_load_string($result);
//Get reach node
$popularity = $xml->xpath("//REACH"); // <-- ERROR OCCURS HERE
//Get the rank attribute
$alexa_rank = (string)$popularity[0]['RANK'];

就像我上面提到的,有时xml树看起来像:

<ALEXA VER="0.9" URL="venturengine.com/" HOME="0" AID="=">
<SD TITLE="A" FLAGS="" HOST="venturengine.com">
<LINKSIN NUM="8"/>
</SD>
<SD>
<POPULARITY URL="venturengine.com/" TEXT="8709770"/>
<REACH RANK="8474566"/>
</SD>
</ALEXA>

有时它看起来像:

<ALEXA VER="0.9" URL="store.guldfors.nu/" HOME="0" AID="=">
<SD TITLE="A" FLAGS="" HOST="store.guldfors.nu"></SD>
</ALEXA>

,它没有REACH或RANK节点/属性。

无论如何都要包装xpath,如:

if($xml->xpath("//REACH") === TRUE) {
  //Get reach node
  $popularity = $xml->xpath("//REACH"); // <-- ERROR OCCURS HERE
  //Get the rank attribute
  $alexa_rank = (string)$popularity[0]['RANK'];
}

我已尝试过以上操作,但无效。

1 个答案:

答案 0 :(得分:0)

我不确定确切的语法,但您可能会尝试计算目标节点集中的节点数,并查看它是否大于零。

例如,count(// Reach)&gt; 0

另一个选项似乎是使用boolean(// Reach)

请参阅xpath find if node exists