Importer un flux XML dans une base de donnée

Eléphanteau du PHP | 32 Messages

02 avr. 2007, 21:15

Bonjour,

J'aimerai importer les données d'un flux XML dans une base Mysql (phpMyadmin) afin de mémoriser le contenu. Il y a beaucoup de posts qui parle du chemin inverse mais je ne trouve rien dans le sens XML vers une base de donnée.

Pouvez-vous m'aider et/ou m'orienter ?

Merci.

Eléphanteau du PHP | 32 Messages

03 avr. 2007, 10:40

Je pense que je vais me tourner vers MagpieRss

http://magpierss.sourceforge.net/

Je pars sur la bonne voie ? :shock:

Eléphanteau du PHP | 32 Messages

03 avr. 2007, 14:09

Trouvé :

http://www.references-web.com/Parser-et ... x-XML.html

Seul défaut, il faut avoir php5 chez l'hébergeur.

Voici un bout de code intéressant :

Code : Tout sélectionner

<?php //connection a la base de donnee $dbhost = ""; $dbuser = ""; // mysql user $dbpass = ""; // mysql password $dbname = ""; // mysql database $conn=mysql_connect($dbhost,$dbuser,$dbpass) or die(erreurServeurMySQL()); mysql_select_db($dbname,$conn) or die('Erreur de selection '.mysql_error()); $flux = simplexml_load_file('http://url-de-votre-flux-xml.com/flux.xml'); foreach ($flux->item as $item) { $link = $item->link; $nom = $item->nom; $description = $item->description ; echo 'link : '.$link.'<br />'; echo 'nom : '.$nom.'<br />'; echo 'description : '.$description.'<br />'; $sql = "INSERT INTO `flux_xml` (`id_item`, `link`, `nom`, `description`) VALUES ('', '$link', '$nom', '$description')"; $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); echo 'données inserées en base'; } ?>[/quote]

Eléphanteau du PHP | 32 Messages

03 avr. 2007, 22:02

Bon, j'ai l'impression de me parler à moi-même mais j'ai bon espoir que quelqu'un me vienne en aide...

Voilà mon fichier XML test : http://www.technobuzz.fr/test_xml.xml

Je cherche à l'importer dans une table avec ce code :

Code : Tout sélectionner

<? //connexion base de donnée //on vérifie que le fichier est OK if (file_exists('http://www.technobuzz.fr/test_xml.xml')) { $flux = simplexml_load_file('http://www.technobuzz.fr/test_xml.xml'); } else { exit('Erreur !....'); } foreach ($flux->channel->product as $product) { $name = $product->name; $sql = "INSERT INTO `mabase` (`name`) VALUES ('$name')"; $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); echo 'données inserées en base'; } ?>
... mais j'ai le message d'erreur dès la lecture du fichier XML.
Quelqu'un saurait me dire ce qu'il se passe ? :cry:

ViPHP
ViPHP | 3607 Messages

03 avr. 2007, 22:45

bonsoir,
... mais j'ai le message d'erreur dès la lecture du fichier XML.
Quelqu'un saurait me dire ce qu'il se passe ? :cry:
Qu'est-ce que tu entends par là ? quel est exactement le message d'erreur ?

Eléphanteau du PHP | 32 Messages

03 avr. 2007, 23:46

Je pense qu'il y avait une mémoire tampon. J'ai vidé les caches et tout est OK.

Il y avait quand même une erreur : il fallait écrire

Code : Tout sélectionner

foreach ($products->product as $product) {
pour respecter le flux.

J'attaque demain les flux dans le flux : j'entend par là les sous-divisions de flux. J'ai par exemple le flux suivant :

Code : Tout sélectionner

<product> <TDProductId>76301235</TDProductId> <name>DCRD-VD405 E</name> <description>DCRD-VD405 E CAMESCOPE DVD</description> <imageUrl>http://www.site.com/images/moyen.gif</imageUrl> <productUrl>monlien</productUrl> <price>769.0</price> <currency>EUR</currency> <TDCategories> <TDCategory> <id>43</id> <name>Camcorders</name> <merchantName>PHOTO - VIDEO>Camescope numérique>DVD></merchantName> </TDCategory> </TDCategories> <fields> <field> <name>marque</name> <value>Sony</value> </field> <field> <name>ean</name> <value>4905524331103</value> </field> <field> <name>fraislivraison2</name> <value>6.9000</value> </field> <field> <name>garantie</name> <value>Garantie 2 ans</value> </field> <field> <name>dispo</name> <value>Expédition en 24h-48h</value> </field> <field> <name>detailfraislivraison</name> <value>Veuillez consulter le site</value> </field> </fields> </product>
Je ne vois pas comment lire et intégrer dans ma base la suite après
<TDCategories> qui est une subdivision du flux <product>

A demain.

Mammouth du PHP | 2937 Messages

04 avr. 2007, 17:07

Salut!
<?php 
// Chargement du fichier XML
$xml = simplexml_load_file ('url-du-fichier-xml');

// Récupération de l'élément TDCategories
$tdcategories = $xml -> TDCategories;

// Récupération d'un nœud dans TDCategories
$tdcategory = $tdcategories -> TDCategory;

// Pour les id, name et merchantName
$id = $tdcategory -> id;
$name = $tdcategory -> name;
$merchantname = $tdcategory -> merchantName;
?>
Sauf bêtise de ma part, ça doit marcher. :wink:

Eléphanteau du PHP | 32 Messages

07 avr. 2007, 10:52

Merci Victor mais je bute sur un caractère spécial dans la lecture du flux.
La lecture bloque sur le symbole suivant : Exemple <titre>L'écran plat </titre>

Je vois bien comment le remplacer infine mais pas dans le mode lecture du XML.

Une solution ?

Voici le message d'erreur

Code : Tout sélectionner

Warning: Invalid argument supplied for foreach() in /home.10.11/technobu/www/script.php5 on line 12 Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home.10.11/technobu/www/script.php5 on line 10

Mammouth du PHP | 2937 Messages

10 avr. 2007, 16:08

Probablement un caractère parasite dans le fichier XML généré. Mais, ce n'est pas le ' qui est en cause.

Eléphanteau du PHP | 32 Messages

10 avr. 2007, 16:35

Merci mais ce qui est bizarre, c'est que quand j'ouvre le fichier XML avec un éditeur de texte et que je fais "éditer-remplacer" ce fameux symbole "'" par un espace " ", je n'ai plus le problème ...