2010-05-04 4 views
0

J'essaie de parcourir un fichier XML Twitter, où la balise conteneur est <users> et chaque utilisateur est <user>. J'ai besoin de créer une variable $id basée sur l'attribut XML <id> pour chaque utilisateur.Erreur d'analyse XML simple

Le nom d'utilisateur est déjà instancié.

$url = "http://api.twitter.com/1/statuses/friends/$username.xml"; 
$xmlpure = file_get_contents($url); 
$listxml = simplexml_load_string($xmlpure); 

foreach($listxml->users->children() as $child) 
    { 
$id = $child->{"id"}; 
//Do another action 
} 

Mais je reçois cette erreur:

Warning: main() [function.main]: Node no longer exists in /home/.../bonus.php on line 32

ligne 32 est l'instruction foreach, et je ne l'utilise pas vraiment la méthode main().

+0

SimpleXML ne tient pas compte de la balise racine, vous ne devriez donc pas utiliser les «utilisateurs» pour balayer l'arborescence. Vous pouvez faire $ listxml-> user ou $ listxml-> children(). –

Répondre

0

Il se peut que le noeud représenté par $child ait et non ait un enfant. Vous pouvez vérifier cela en utilisant isset() ou même en produisant le XML du nœud avec echo $child->asXML();

De même, si vous souhaitez utiliser $id sous la forme d'une chaîne, vous devez le convertir en tant que tel.

$id = (string) $child->id; 

Une autre chose, vous pouvez charger le document comme celui-ci:

$listxml = simplexml_load_file($url); 

Enfin, pour poser une question ici, s'il vous plaît toujours un lien à un échantillon représentatif du document XML d'origine.


Mise à jour

Comme on s'y attendait, que vous venez de ne pas accéder aux nœuds droite. Si vous spécifiez le nom d'un noeud inexistant ("users" dans votre exemple) SimpleXML crée une sorte de noeud fantôme temporaire au lieu de générer une erreur. C'est pour permettre de créer de nouveaux nœuds plus facilement je crois.

Quoi qu'il en soit, voici ce que votre script devrait ressembler à:

$users = simplexml_load_file($url); 

foreach ($users->user as $user) 
{ 
    $id = (string) $user->id; 
} 

toujours nommer votre PHP vars selon le nœud qu'ils représentent afin que vous sachiez toujours où vous êtes dans l'arbre; cela vous épargnera beaucoup de futurs problèmes similaires. Le nœud racine est <users/> donc la variable est $users et la même chose pour <user/>/$user.

+0

Désolé à ce sujet. Voici un exemple de fichier XML: http://api.twitter.com/1/statuses/friends/randomuser.xml Existe-t-il une différence entre la syntaxe $ child-> id et $ child -> {" id "} syntaxe? – phpeffedup

+0

Non, il n'y a pas de différence fonctionnelle entre les deux syntaxes, c'est pourquoi je préfère la syntaxe la plus simple;) –