2010-07-20 6 views
0

Le code PHP suivant:SimpleXML et PHP expression XPath ne pas retourner les données correctes

<html> 
<?php 


$name = Secrezy; 
$server = Sunstrider; 

$raidurl='http://eu.wowarmory.com/character-achievements.xml?r='.$server.'&cn='.$name.'&c=168'; 
print_r($raidurl); // This is to check if the link is valid. Follow the link printed here and you should find a valid XML page 
echo "<br>"; 
$xmlraid = simplexml_load_file($raidurl); 
$achievement = array($xmlraid->xpath("/category/achievement[@id='4602']")); 
print_r($achievement); 

?> 
</html> 

ne fonctionne pas comme j'attendre à. Ne devrait pas $ rempli avec ceci:

<achievement categoryId="168" dateCompleted="2010-03-26T00:01:00+01:00" desc="Complete the 10-player raid achievements listed below." icon="inv_helmet_74" id="4602" points="25" reward="Reward: Bloodbathed Frostbrood Vanquisher" title="Glory of the Icecrown Raider (10 player)"> 

Au lieu de cela, je viens d'obtenir un tableau vide.

Voici l'URL complète à la page http://eu.wowarmory.com/character-achievements.xml?r=Sunstrider&cn=Secrezy&c=168

Merci! Editer: Après avoir changé le xpath de/achievements/category/achievement [@ id = '4602'] que j'ai complètement raté, tout fonctionne bien. Donc merci pour ça. Toutefois, si je l'implémente dans mon code d'origine, cela ne fonctionne toujours pas comme je le souhaiterais. Je suis sûr que je fais quelque chose de terriblement mal, alors merci pour l'aide.

<?php 
echo "<html> 
<head> 
    <title>ARMORY.</title> 
    <meta http-equiv='Content-Type' content='text/html' charset=iso-8859-1> 
</head> 
<body> 
<table width='50%' border='1' cellpadding='10' cellspacing='10'>"; 
ini_set("user_agent", "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8"); 

$server = "Sunstrider"; 
$guild = "Operation+Eskimo"; 

$url='http://eu.wowarmory.com/guild-info.xml?r='.$server.'&gn='.$guild; 
$xml = simplexml_load_file($url); 



$array = array(); 



foreach($xml->guildInfo->guild->members->character as $char) 
    if(strtolower($char['level']) === '80') 
    { 
     $array[] = $char['name']."<br />"; 
    } 

$i = 0; 
while($array[$i] != null) 
{ 
$name = $array[$i]; 
$raidurl='http://eu.wowarmory.com/character-achievements.xml?r='.$server.'&cn='.$name.'&c=168'; 
$xmlraid = simplexml_load_file($raidurl); 
var_dump($xmlraid); 
echo "<br><br>"; 
$achievement = array($xmlraid->xpath("/achievements/category/achievement[@id='4602']")); 
    $i++; 
} 


?> 

</body> 
</html> 

Ce var_dump de xmlraid ne produit que ce (beaucoup de fois en raison de $ i):

object(SimpleXMLElement)#3 (2) { ["@attributes"]=> array(2) { ["lang"]=> string(5) "en_us" ["requestUrl"]=> string(27) "/character-achievements.xml" } ["category"]=> object(SimpleXMLElement)#2 (1) { ["category"]=> array(12) { [0]=> object(SimpleXMLElement)#5 (0) { } [1]=> object(SimpleXMLElement)#6 (0) { } [2]=> object(SimpleXMLElement)#7 (0) { } [3]=> object(SimpleXMLElement)#8 (0) { } [4]=> object(SimpleXMLElement)#9 (0) { } [5]=> object(SimpleXMLElement)#10 (0) { } [6]=> object(SimpleXMLElement)#11 (0) { } [7]=> object(SimpleXMLElement)#12 (0) { } [8]=> object(SimpleXMLElement)#13 (0) { } [9]=> object(SimpleXMLElement)#14 (0) { } [10]=> object(SimpleXMLElement)#15 (0) { } [11]=> object(SimpleXMLElement)#16 (0) { } } } 

Je dois ajouter que je suis très nouveau pour PHP si mon code n'est pas grand.

+1

Je reçois totalement d'autres tags que vous cherchez (div avec des noms de classe). Y at-il autre chose que nous devrions envoyer pour voir le XML que vous essayez d'utiliser? – Wrikken

+0

@Wrikken: Quel navigateur utilisez-vous? Peut-être que la feuille de style XSL est automatiquement appliquée. Si je vois la source dans Firefox 3.6, je peux voir le XML. –

+0

Hmmm, nope (opéra), qui peut utiliser XSL. Mais je vais essayer FF – Wrikken

Répondre

0

Non, vérifiez the doc. simplexml_load_file() renvoie un objet représentant le code XML dans $xmlraid. Je suggère de faire un var_dump($xmlraid); et de vérifier votre expression xpath.

2

devrait-il pas être XPath:

/achievements/category/achievement[@id='4602'] 

Ou:

//category/achievement[@id='4602'] 

http://www.w3schools.com/xpath/xpath_syntax.asp

Mise à jour:

Le problème avec ce code est le fait que vous ajoutiez <br /> à la fin de chaque nom dans $array. En règle générale, évitez d'ajouter une mise en forme de cette manière, à moins d'une bonne raison.

Aussi, notez mes notes dans les commentaires. Surtout, urlendcode(). Je l'ai laissé pour vous faire avec $url car je ne l'ai pas remarqué avant de commencer cette édition et je suis paresseux. ;) Notez qu'une fois que vous aurez passé ces paramètres de chaîne de requête à urlencode(), le + dans le nom de la guilde ne sera pas nécessaire et il entrera dans le chemin.

ini_set("user_agent", "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8"); 

$server = "Sunstrider"; 
$guild = "Operation+Eskimo"; 

$url='http://eu.wowarmory.com/guild-info.xml?r='.$server.'&gn='.$guild; 
$xml = simplexml_load_file($url); 

$array = array(); 

foreach ($xml->guildInfo->guild->members->character as $char) 
{ 
    if (strtolower($char['level']) === '80') 
    { 
     $array[] = $char['name']; 
    } 
} 

foreach ($array as $i => $name) 
{ 
// note that this if statement and $i in the foreach are only here to limit this to 1 for testing, the full list spews out A LOT of data and takes A LONG time 
if ($i) 
{ 
exit; 
} 
    // note the urlencode() call, that's important 
    $raidurl='http://eu.wowarmory.com/character-achievements.xml?r=' . urlencode($server) . '&cn=' . urlencode($name) . '&c=168'; 
    $xmlraid = simplexml_load_file($raidurl); 

    // note the pre tags around var_dump, makes things easier to read in the browser 
    // also note print instead of echo, I lke to do this for debugging, as it makes 
    // it easier to determine what's is debug output for those long running debugging sessions 
    print '<pre>'; 
    var_dump($xmlraid); 
    print '</pre>'; 
    echo "<br><br>"; 

    // quick and dirty solution for viewing the XML 
    /*print '<textarea cols="400" rows="2000">'; 
    print $xmlraid->asXML(); 
    print '</textarea>';*/ 

    $achievement = $xmlraid->xpath("/achievements/category/achievement[@id='4602']"); 

    print '<pre>'; 
    var_dump($achievement); 
    print '</pre>'; 
} 
+0

+1 Oui, il manque l'élément racine. –

+0

Merci beaucoup George. – James

0

L'élément de document est achievements.

Votre déclaration XPATH devrait être:

/achievements/category/achievement[id='4602'] 
0

Bon sang, ces gens sont navigateur-renifleurs désagréables.Je ne le fais pas en vain que, cela fonctionne:

<?php 
$opts = array(
    'http' => array(
     'header' => 'User-Agent: Firefox/3.5.9\r\n' 
    ) 
); 
$context = stream_context_create($opts); 
libxml_set_streams_context($context); 

$d = simplexml_load_file('http://eu.wowarmory.com/character-achievements.xml?r=Sunstrider&cn=Secrezy&c=168'); 
var_dump($d->xpath("//achievement[@id='4602']")); 

La chose triste est __extremely_, au début, j'espérais que ce serait au moins Accept ou au plus Accept-Encoding - têtes. Mais non, le "ne devrait pas signifier quelque chose de significatif" - User-Agent -header. Un bon exemple pourquoi le reniflage de navigateur est mauvais si j'en ai jamais vu un.

+0

Merci pour votre aide. J'ai effectivement eu l'agent d'utilisateur dans mon code original que j'ai maintenant édité dans la première publication. simplexml_load_file semble fonctionner maintenant à moins que j'essaie de l'implémenter dans une boucle while ... – James

Questions connexes