[SimpleXML] Impossibilité de parser fichier xml

Eléphanteau du PHP | 19 Messages

24 août 2007, 02:16

Bonjour,


Je rencontre un problème pour lire un fichier xml via simplexml.

Pour parser le flux xml avec Simplexml, j'ai créer 2 fichiers : index.php5 et flux.xml

Dans le fichier index.php5, j'ai intégrer ce code :
<?php
$element = simplexml_load_file('flux.xml');
foreach($element->produit as $produit) {
echo 'Type de produit : ' ,$produit->ProductType.'<br>'; 
echo 'Titre de la sonnerie : ' ,$produit->Caption.'<br>';
echo 'Auteur : ' , $produit->Interpret.'<br><br>';
}
?>
Et dans le fichier xml, j'ai fais un copier coller du code xml généré avec un webservice de sonneries.

Ce qui donne ceci :

Code : Tout sélectionner

<ArrayOfProduct> <Product Id="748629"> <Localization> http://content.mkmb.net/p.ashx?id=748629&f=56&t=.mp3 </Localization> <Caption>Love today</Caption> <CommandUrl> http://nos-sonneries.magikmobile.com/culture/fr-FR/popup-redirect.aspx?q5=748629&p=53 </CommandUrl> <ProductType>Hi-fi cd originale</ProductType> <ProductTypeId>53</ProductTypeId> <Interpret>Mika</Interpret> </Product> <Product Id="689507"> <Localization> http://content.mkmb.net/p.ashx?id=689507&f=56&t=.mp3 </Localization> <Caption>Parce qu'on sait jamais</Caption> <CommandUrl> http://nos-sonneries.magikmobile.com/culture/fr-FR/popup-redirect.aspx?q5=689507&p=53 </CommandUrl> <ProductType>Hi-fi cd originale</ProductType> <ProductTypeId>53</ProductTypeId> <Interpret>Christophe Maé,Jacquot</Interpret> </Product> <Product Id="690576"> <Localization> http://content.mkmb.net/p.ashx?id=690576&f=56&t=.mp3 </Localization> <Caption>Je Me Bats</Caption> <CommandUrl> http://nos-sonneries.magikmobile.com/culture/fr-FR/popup-redirect.aspx?q5=690576&p=53 </CommandUrl> <ProductType>Hi-fi cd originale</ProductType> <ProductTypeId>53</ProductTypeId> <Interpret>Kenza Farah </Interpret> </Product>

Lorsque j'essaye de visualiser la page php, j'obtiens ces erreurs là :

Warning: simplexml_load_file() [function.simplexml-load-file]: flux.xml:4: parser error : EntityRef: expecting ';' in /home5/g/gsm-sonnerie/www/test/index.php5 on line 3

Warning: simplexml_load_file() [function.simplexml-load-file]: http://content.mkmb.net/p.ashx?id=748629&f=56&t=.mp3 in /home5/g/gsm-sonnerie/www/test/index.php5 on line 3

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home5/g/gsm-sonnerie/www/test/index.php5 on line 3


Vous pouvez voir le résultat à cette adresse :
http://www.gsm-sonnerie.com/test/index.php5

J'ai remarqué qu'il y avait un autre post similaire mais celà m'a pas aidé à résoudre mon problème.


Merci pour votre aide,

José

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

24 août 2007, 03:40

Ton fichier XML n'est pas valide. Comme le message d'erreur l'indique, à la ligne 4 il y a une entité et le parser s'attend logiquement à voir un point-virgule ; -- Si tu veux utiliser le caractère & dans tes données il faut l'échapper et donc utiliser & à la place.

À noter que le problème ne se poserait pas si tu utilisais SimpleXML pour créer le fichier, c'est beaucoup plus sûr que le faire à la main et les échappements se font automatiquement.
$xml = simplexml_load_string('<ArrayOfProduct />');

$product = $xml->addChild('Product');
$product['Id'] = 748629;
$product->Localization = 'http://content.mkmb.net/p.ashx?id=748629&f=56&t=.mp3';
// etc...

$product = $xml->addChild('Product');
$product['Id'] = 689507;
$product->Localization = 'http://content.mkmb.net/p.ashx?id=689507&f=56&t=.mp3';
// etc...

$xml->asXML('flux.xml');

Eléphanteau du PHP | 19 Messages

24 août 2007, 12:24

Merci pour ta réponse, j'ai donc modifié le fichier xml en suivant tes conseils comme ceci :

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?> <ArrayOfProduct> <Product Id="748629"> <Localization> http://content.mkmb.net/p.ashx?id=748629&f=56&t=.mp3; </Localization> <Caption>Love today</Caption> <CommandUrl> http://nos-sonneries.magikmobile.com/culture/fr-FR/popup-redirect.aspx?q5=748629&p=53; </CommandUrl> <ProductType>Hi-fi cd originale</ProductType> <ProductTypeId>53</ProductTypeId> <Interpret>Mika</Interpret> </Product> <Product Id="689507"> <Localization> http://content.mkmb.net/p.ashx?id=689507&f=56&t=.mp3; </Localization> <Caption>Parce qu'on sait jamais</Caption> <CommandUrl> http://nos-sonneries.magikmobile.com/culture/fr-FR/popup-redirect.aspx?q5=689507&p=53; </CommandUrl> <ProductType>Hi-fi cd originale</ProductType> <ProductTypeId>53</ProductTypeId> <Interpret>Christophe Mae,Jacquot</Interpret> </Product> <Product Id="690576"> <Localization> http://content.mkmb.net/p.ashx?id=690576&f=56&t=.mp3; </Localization> <Caption>Je Me Bats</Caption> <CommandUrl> http://nos-sonneries.magikmobile.com/culture/fr-FR/popup-redirect.aspx?q5=690576&p=53; </CommandUrl> <ProductType>Hi-fi cd originale</ProductType> <ProductTypeId>53</ProductTypeId> <Interpret>Kenza Farah </Interpret> </Product> </ArrayOfProduct>

Et le fichier php, je l'ai laissé comme tel :
<?php
$element = simplexml_load_file('flux.xml');
foreach($element->produit as $produit) 
{
echo 'Type de produit : ' , $produit->ProductType.'<br>';
echo 'Titre de la sonnerie : ', $produit->Caption.'<br>';
echo 'Auteur : ' , $produit->Interpret.'<br><br>';
}
?>
Cependant, maintenant je n'ai plus d'erreur mais rien ne s'affiche non plus sur ma page
http://www.gsm-sonnerie.com/test/index.php5


Je suis débutant pour parser les flux xml et j'aimerais beaucoup maitriser ce language.

Si j'utilisais SimpleXML pour créer le fichier, est ce que le flux du site se mettrait à jour en même temps que le mien si le site change de contenu ?

Autrement, si je créer le fichier xml avec simplexml, je ne suis plus obliger de garder le fichier 'flux.xml' ?


Cordialement,

José

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

25 août 2007, 00:20

Ta boucle traite tous les élements dont le nom est "produit", puisqu'il n'y a aucun éléments de ce nom, elle ne fait rien. Quand tu as ce genre de problèmes, utilise var_dump() sur toutes les variables concernées pour voir ce qu'elles renferment. Le code que tu recherches doit être
foreach($element->Product as $product)
{
    echo 'Type de produit : ' , $product->ProductType, '<br>';
    echo 'Titre de la sonnerie : ', $product->Caption, '<br>';
    echo 'Auteur : ' , $product->Interpret, '<br><br>';
}
Si j'utilisais SimpleXML pour créer le fichier, est ce que le flux du site se mettrait à jour en même temps que le mien si le site change de contenu ?
Je ne suis pas sûr de savoir de quoi tu parles. Je ne sais pas comment est généré ton fichier flux.xml, probablement avec des "echo" ou sous la forme d'une variable que tu sauves ensuite dans un fichier ?
Autrement, si je créer le fichier xml avec simplexml, je ne suis plus obliger de garder le fichier 'flux.xml' ?
La méthode asXML() de SimpleXML fait exactement la même chose que la fonction file_put_contents() que tu dois probablement utiliser. Rien ne change à part le nom de la fonction, le fonctionnement de ton code n'est pas modifié

Par exemple, ces deux scripts font la même chose: (en imaginant que $product_id et $url sont définis quelque part)
<?php
$xml = '<?xml version="1.0" encoding="UTF-8"?> 
<ArrayOfProduct>';

$xml .= '<Product Id="' . htmlspecialchars($product_id) . '">';
$xml .= '<Localization>' . htmlspecialchars($url) . '</Localization>';
$xml .= '</ArrayOfProduct>';

file_put_contents('flux.xml', $xml);
<?php
$xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8"?><ArrayOfProduct />');

$product = $xml->addChild('Product');
$product['Id'] = $product_id;
$product->Localization = $url;

$xml->asXML('flux.xml');

Eléphanteau du PHP | 19 Messages

25 août 2007, 21:42

Le code XML est généré automatiquement par un webservice selon le choix de ce que l'on souhaite afficher (Ex: sonneries hifi, logos couleurs, ...) et ensuite je fais un copier coller du code que j'intégre dans un fichier avec l'extension XML.

Je vais créer le fichier comme tu me l'as expliqué avec SimpleXML, c'est vrai que ça a l'air beaucoup plus simple et ça limite les erreurs.

La question que je me pose actuellement c'est est ce que les 'sonneries' vont se mettre à jour dès que le flux du site change ?
Ou bien est ce à moi de changer régulièrement le code source xml dans mon fichier php ou regénérer le cache ?

Je souhaite intégrer du contenu dynamique qui change régulièrement, le contenu ne provient pas de moi et je l'intègre juste l'intégrer sur mon site.


Merci pour tes conseils, j'y vois un peu plus clair maintenant

Eléphant du PHP | 130 Messages

15 sept. 2007, 11:37

Peut mettre l' instruction de transtypage (string) ?
Du genre :
...
echo 'Auteur : ' , (string) $produit->Interpret.'<br><br>'; 
Car PHP devra décider pour echo, si c'est un objet ou une chaîne de caratère.
Le vent souffle où il veut et tu en entends le bruit,
Mais tu ne sais d'où il vient, ni où il va ...