[SimpleXML] Incapacité de lecture du fichier XML

Petit nouveau ! | 8 Messages

07 août 2007, 23:12

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

ViPHP
ViPHP | 928 Messages

08 août 2007, 09:59

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.

Petit nouveau ! | 8 Messages

08 août 2007, 23:02

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

08 août 2007, 23:18

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

Petit nouveau ! | 8 Messages

09 août 2007, 04:12

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 ?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

09 août 2007, 18:27

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 ?

Petit nouveau ! | 8 Messages

10 août 2007, 19:11

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

10 août 2007, 19:19

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.

Petit nouveau ! | 8 Messages

11 août 2007, 01:30

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 ?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

11 août 2007, 01:58

À tout hasard, rapidshare.com

Petit nouveau ! | 8 Messages

11 août 2007, 02:19

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 ?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

11 août 2007, 02:22

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>

Petit nouveau ! | 8 Messages

11 août 2007, 02:33

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

11 août 2007, 02:58

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.

Petit nouveau ! | 8 Messages

11 août 2007, 03:18

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 !
Modifié en dernier par Pierrick584 le 11 août 2007, 03:28, modifié 1 fois.