2012-03-29 6 views
0

Ich frage Alexa, um eine bestimmte URL-Rangliste zu erhalten. Die Rückgabe erfolgt in XML. Meistens gibt Alexa XML zurück, das die REACH & RANK-Werte enthält, obwohl dies manchmal nicht der Fall ist. Wenn dies nicht der Fall, greift der Code unten, dass der Wert für RANK einen Fehler wirft:PHP: Wie überprüft man, ob ein Knoten existiert und wenn er keinen XPath benutzt?

Fatal error: Call auf eine Elementfunktion xpath() auf einem Nicht-Objekt ...

// 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']; 

Wie ich erwähnte oben, manchmal die xML-Struktur wie folgt aussieht:

<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> 

und manchmal ist es wie folgt aussieht:

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

, die nicht über die REACH- oder RANK-Knoten/Attribute verfügt.

Gibt es trotzdem, den XPath wie einzuwickeln:

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']; 
} 

ich die oben versucht habe, funktioniert nicht.

Antwort

0

Ich bin mir nicht sicher über die genaue Syntax, aber Sie könnten versuchen, die Anzahl der Knoten in der Zielknotenmenge zu zählen und zu sehen, ob sie größer als Null ist.

Zum Beispiel zählt (// Reichweite)> 0

Eine weitere Option erscheint verwenden boolean zu sein (// Reichweite)

Siehe xpath find if node exists

+0

Ich habe versucht, den get-Knoten Abschnitt mit der Verpackung um die Anzahl der Knoten zu zählen: 'if (count ($ xml-> xpath ('// *')> 2)) {}' und es hat nicht funktioniert. Die Syntax könnte jedoch nur falsch sein, nicht die Idee. –

+0

Ich weiß nicht, PHP. Enthält der Aufruf zum Zählen innerhalb des Aufrufs von xpath - z. B. $ xml-> xpath ("count (// *)> 2") - funktioniert? – Steve

Verwandte Themen