2012-03-29 5 views
0

私は与えられたURLのランキングを得るためにAlexaに問い合わせています。戻り値はXMLです。ほとんどの場合、AlexaはREACH & RANK値を含むXMLを返しますが、時にはそうではありません。PHP:ノードが存在し、xpathを使用していないかどうかをチェックするには?

致命的なエラー:...非オブジェクトのメンバ関数の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']; 

同様にそれがないではない場合は、その次のコードは、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']; 
} 

は、動作しません。

答えて

0

正確な構文はわかりませんが、ターゲットノードセットのノード数を数え、ゼロより大きいかどうかを調べるとよいでしょう。

例えば、カウント(//リーチ)> 0

別のオプションは、ブール(//リーチ)を使用するように見える

xpath find if node exists

+0

を参照してください、私はしてgetノードセクションをラップしようとしました'if(count($ xml-> xpath( '* *')> 2)){}'というノードの数を数えるためには、次のようになります。構文は、アイデアではなく、間違っているかもしれません。 –

+0

私はPHPを知らない。 xpath(例えばcount(// *)> 2)の呼び出しの中でカウントする呼び出しを含むか? – Steve

関連する問題