Page 1 sur 2

[SimpleXML] Incapacité de lecture du fichier XML

Posté : 07 août 2007, 23:12
par Pierrick584
Bonjour, j'essai d'ouvrire un fichier XML a partir du script php, mais j'ai des erreur comme de quoi mon fichier XML n'est pas correct, voici les erreur
Warning: simplexml_load_file() [function.simplexml-load-file]: file:///C%3A/tibiaserver/data/accounts/1428616.xml:1: parser error : Extra content at the end of the document in C:\wamp\www\connection.php on line 14

Warning: simplexml_load_file() [function.simplexml-load-file]: er name="Rowan Kartoffel" /><character name="Sorctest" /></characters></account> in C:\wamp\www\connection.php on line 14

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in C:\wamp\www\connection.php on line 14
NULL
voici le fichier

Code : Tout sélectionner

<?xml version="1.0"?><account pass="potato666" premDays="0" premEnd="0"><characters><character name="An unknow Wanderer" /><character name="Druidtest" /><character name="Rowan Kartoffel" /><character name="Sorctest" /></characters></account>
le fichier ayan été créé par un serveur de jeux, ne peut etre modifier de plusoumoin aucune maniere, les seule modification qui ne cause pas le bloquage de l'account est d'ajouter des personage, et de modifier les information présente (mot de passe et durée du premium)

au cas ou sa peut aider, voici le code de mon script

Code : Tout sélectionner

<?php require "serverinfo.php"; $account = $_POST['account']; $password = $_POST['password']; $accountxml = $account . ".xml"; $fileaccountdir = $accountdir . $accountxml; // $accountdir est une variable dans serverinfo.php qui définit le chemin complet pour accédé au dossier contenant tout les account if ($account && $password != null) { if (file_exists($fileaccountdir)) { $fileaccount = simplexml_load_file($fileaccountdir); echo $xml->account[0]['pass']; var_dump($xml); } else { echo $fileaccountdir . '<BR>'; exit('Echec lors de l\'ouverture du fichier test.xml.'); } } else { echo '<CENTER> <FORM method="post" action="connection.php"> Account: <input type="password" name="account"><BR><BR> Password: <input type="password" name="password"><BR><BR> <input type="submit" value="valider">'; }
merci d'avance

Posté : 08 août 2007, 09:59
par Genova
Bonjour,
encore faut il faire du XML valide pour qu'il soit correctement lu :

Code : Tout sélectionner

<character name="Sorctest" /></characters>
il y a une double fermeture de balise.

Posté : 08 août 2007, 23:02
par Pierrick584
bel essai mais au debut du character, ya une "double ouverture"

Code : Tout sélectionner

"><characters><character name="An unknow Wanderer" />
sa ouvre une section character, qui apres contient chaque personage a l'individuel, deuxiemement, c'est pas moi qui a fait le fichier xml, il est généré automatiquement par le serveur du jeux, et il n'y a aucune erreur sur ce coté...

Posté : 08 août 2007, 23:18
par Hubert Roksor
il n'y a aucune erreur sur ce coté...
En fait il n'y a aucune erreur dans ce que tu as posté, ce qui me laisse penser que tu n'as pas poster le bon fichier... En tout cas, chez moi ça marche :-k

Posté : 09 août 2007, 04:12
par Pierrick584
pourtan j'ai effectivement bien poster les bon fichier... :( peut etre le probleme est dans ma configuration du serveur, ou dans je ne sait quoi qui cause une mauvaise interpretation ?

Posté : 09 août 2007, 18:27
par Hubert Roksor
C'est étrange parce que j'ai essayé d'obtenir le même message d'erreur et je n'y suis pas parvenu. Quelles sont tes versions de PHP/SimpleXML/libxml2 ? Si tu as bien posté le bon fichier il s'agit certainement d'un bug de ton PHP, qui aurait été corrigé dans une version plus récente (j'ai testé sur la 5.2.4).

Installe une version récente de PHP en local et reteste pour en être sûr ?

Posté : 10 août 2007, 19:11
par Pierrick584
apres une mise a jour de wamp. je suis maintenant en 5.2.3 (d'ou sort tu ton 5.2.4 ? sous php.net il n'y est pas) et j'ai encore le meme probleme... peut etre que je doit configuré quelque chose ? tout est par défault..

Posté : 10 août 2007, 19:19
par Hubert Roksor
Tu peux trouver les dernières versions (instables) sur http://snaps.php.net

5.2.3 et 5.2.4 sont très similaires, donc je doute que le problème vienne de là. Est-ce que tu pourrais faire un zip (ou 7z) du script et du fichier XML et le mettre quelque part pour qu'on puisse jeter un œil ? Parfois le fait de copier/coller change la donne.

Sinon, je ne vois pas quelle option de configuration pourrait générer ce genre d'erreur, donc a priori tout ce qu'il reste est un problème dans le fichier XML ou ton script.

Posté : 11 août 2007, 01:30
par Pierrick584
je n'ai aucun autre moyen que de monter un FTP sur mon ordinateur, étan donné que je le ferme la nuit et que je ne suit pas de france, coté décalage horraire sa risque d'etre compliqué, sinon tu conais un site sur lequel je pourais uploadé ca ?

Posté : 11 août 2007, 01:58
par Hubert Roksor
À tout hasard, rapidshare.com

Posté : 11 août 2007, 02:19
par Pierrick584
http://rapidshare.com/files/48228961/co ... n.zip.html

Voila ! peut etre que l'arborescence d'ou est le fichier xml peut en etre la cause, essai de le reproduire ?

Posté : 11 août 2007, 02:22
par Hubert Roksor
Le problème vient du nœud <websiteinfo> qui se trouve après le nœud <account>. Tu ne peux avoir qu'un seul nœud à la racine d'un arbre XML donc il te faut soit déplacer <websiteinfo> dans <account> soit créer un nœud racine qui regroupe <websiteinfo> et <account>

Posté : 11 août 2007, 02:33
par Pierrick584
je sent que jvais avoir lair tres stupide la mais... c'est quoi le noeud ? :\

edit: oublis premier commentaire, je me suis rendu compte de quoi tu parlais, et.. pour ce qui est de ca, sa provoquais des erreur dans le serveur du jeux donc sa n'etais pas sensé rester la, j'etais sur de l'avoir enlever, et effectivement, sa marche une fois que c'est enlever :D enfin... ce n'est plus la meme erreur plutot, le code etais sensé sortire le mot de passe, mais la..
object(SimpleXMLElement)#1 (2) { ["@attributes"]=> array(3) { ["pass"]=> string(9) "potato666" ["premDays"]=> string(1) "0" ["premEnd"]=> string(1) "0" } ["characters"]=> object(SimpleXMLElement)#2 (1) { ["character"]=> array(4) { [0]=> object(SimpleXMLElement)#3 (1) { ["@attributes"]=> array(1) { ["name"]=> string(18) "An unknow Wanderer" } } [1]=> object(SimpleXMLElement)#4 (1) { ["@attributes"]=> array(1) { ["name"]=> string(9) "Druidtest" } } [2]=> object(SimpleXMLElement)#5 (1) { ["@attributes"]=> array(1) { ["name"]=> string(15) "Rowan Kartoffel" } } [3]=> object(SimpleXMLElement)#6 (1) { ["@attributes"]=> array(1) { ["name"]=> string(8) "Sorctest" } } }

pourquoi sa me sort tout ca ? :\

comme tu peut voir la fonction simpleXML est loin de m'etre familliere, sur un autre forum on m'avais dit d'utiliser ca, mais je ne m'en suis jamais servis avan..

Posté : 11 août 2007, 02:58
par Hubert Roksor
Comme tu l'as certainement deviné, "nœud" = "élément". Je crois que "élément" est le terme le plus juste, même si on voit souvent utiliser le terme "nœud" quand on parle de DOM.

Pour SimpleXML, quand tu fais simplexml_load_file() ou simplexml_load_string() le résultat correspond à l'élément racine ("root element" in english dans le texte). C'est comme un objet dont les propriétés représentent les descendants directs. Au passage, prends pour habitude d'appeler la variable du même nom que l'élément racine, ça paraît plus naturel. Par exemple, si tu fais
$account = simplexml_load_file($fileaccountdir);
...tu pourras accéder à la liste des personnages par $account->characters ou même faire
foreach ($account->characters->character as $character)
{
    echo $character['name'], '<br />';
}
...pour lire chacun des personnages.

On peut également accéder aux attributs d'un élément comme s'il s'agissait d'un tableau. Dans ton exemple, après avoir effacé les données en trop dont on parlait plus haut, tu peux accéder au "pass" par
$account['pass']
Attention toutefois, dans la plupart des cas, quand on accède à un élément ou un attribut c'est via un élément SimpleXMLElement. Donc il est de bon ton de forcer le type de $account['pass'] pour le transformer en chaîne de caractères. C'est généralement fait automagiquement par PHP, mais mieux vaut prévénir que guérir.
$pass = (string) $account['pass'];
sur un autre forum on m'avais dit d'utiliser ca
C'est plutôt un bon conseil, SimpleXML est la meilleure façon de lire du XML. Une fois que tu as compris comment accéder à un élément ou un attribut, tu sais déjà presque tout.

Posté : 11 août 2007, 03:18
par Pierrick584
Merci ! justement eventuellement il falais que je puisse faire une liste des personage, par contre comment on enleve ces donnée de trop ? :\ je crois avoir manqué ce passage

edit: oublis, j'ai trouver ce qui imprimais ce surplus d'information :) je vais gosser un peut avec tout ca, merci énormément !