Aller au contenu

Importer un flux XML dans une BDD


Americas

Sujets conseillés

Je cherche un moyen pour importer un flux XML dans une BDD car les requêtes SQL son beaucoup plus rapides qu'en parsant directement le flux.

Bien sûr, l'avantage du flux est qu'il est constamment mis à jour... donc il faudrait que le script d'importation fonctionne automatiquement ou que je le lance manuellement à chaque fois que je souhaite réactualiser la base.

Si vous avez une idée sur le sujet... en expliquant simplement à un plus que novice en la matière... je vous en serais reconnaissant :)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Pour répondre partiellement, quand tu auras ton script de parsing (que tu trouveras sans difficultés sur les site de script comme hotscripts.com) et si tu as pas accès aux tâche CRON de ton serveur, tu pourras toujours les lancer automatiquement à intervalles réguliers en faisant appel aux services gratuits de webcron.org

Patrick

Lien vers le commentaire
Partager sur d’autres sites

Salut Américas,

Je cherche un moyen pour importer un flux XML dans une BDD car les requêtes SQL son beaucoup plus rapides qu'en parsant directement le flux.

Ca c'est pas sur, tout dépend du flux distant à parser et de ta BDD, le plus rapide si tu vas chercher les memes infos et que tu les manipules pas, c'est un fichier cache mis à jour régulièrement.

Lien vers le commentaire
Partager sur d’autres sites

Hello,

Pour la gestion de la mise à jour, tu peux effectivement la faire par une tache cron et en comparant les timestamps des fichiers tu peux filtrer et ne mettre à jour que ceux qui ont été modifiés (attention cela ne marche que pour les fichiers statiques, pour les dynamiques, tu le fais systématiquement).

Par exemple, dans mon cas, j'affiche la liste des flux et je mets en rouge ceux qui ont été modifiés depuis ma dernière visite et je peux le faire manuellement ou en automatique.

Lien vers le commentaire
Partager sur d’autres sites

En ce qui me concerne, je n'ai pas besoin de stocker les données, donc je charge le flux XML en mémoire, (variable application) et je recharge losrque le flux a changé.

L'écriture sur ta base reste une option intéressante, si tu souhaites conserver, ou manipuler le flux en SQL, sinon, bof.

Lien vers le commentaire
Partager sur d’autres sites

Merci à tous pour vos remarques.

Je sais qu'on doit utiliser les cron et les timestamps pour raffraichir tout cela... bon en théorie... parce que pour la pratique c'est autre chose :D

Mais commençons par le commencement...

Comme je disais au début... je préfère le traitement SQL pour une question de rapidité... donc la première chose c'est de pouvoir importer le flux dans la bdd... mais c'est ça que je ne sais pas faire :lol:

Lien vers le commentaire
Partager sur d’autres sites

Je n'ai pas de stucture précise en tête... je cherche la méthode pour remplir une base et créer la table en fonction du flux à importer.

Je peux vous donner un flux au hasard pour servir de base à la méthode : -http://v4.cibleclick.com/opodo/SEJOURSOPODO.xml

A partir de ce flux il faudrait créer la table en fonction des différents items présents sur le flux et remplir les champs adéquats :rolleyes:

Lien vers le commentaire
Partager sur d’autres sites

-http://v4.cibleclick.com/opodo/SEJOURSOPODO.xml

Hello América,

Ton lien ne me paraît pas fonctionnel (ou quelque chose m'a échappé)... Le sujet m'intéresse et je voudrais bien voir la structure du fichier... Si tu veux, tu peux me l'envoyer en MP...

Lien vers le commentaire
Partager sur d’autres sites

Le lien était fonctionnel pour moi ;-) (par contre c'est long a venir ^^)

Voici la structure

<?xml version='1.0' encoding='ISO-8859-1'?>
<feed>
<sejour>
<id>1</id>
<pays><![CDATA[France Bretagne]]></pays>
<titre><![CDATA[6J/6N-THALASSTONIC 3*]]></titre>
<form><![CDATA[HOTEL+CURE+DEMI-PENSION+CURE]]></form>
<ville><![CDATA[ROSCOFF]]></ville>
<arrivee><![CDATA[ROSCOFF - ROSCOFF]]></arrivee>
<ref><![CDATA[SAI00512855]]></ref>
<duree>6</duree>
<img><![CDATA[http://opodo.service-voyages.com/zi/promovac/55/SAI00512855A_pp.jpg]]></img>
<resum><![CDATA[
C'est à Roscoff, précisément, pour le cadre, la qualité de l'air et de l'eau, que le Docteur Bagot choisit il y a un siècle de créer le premier centre de thalassothérapie.
100 ans après, profitez de cette expérience inestimable et de soins exclusifs dispensés dans un environnement exceptionnel. Directement relié au centre de thalassothérapie, l'hôtel Thalasstonic vous invite à son bord. Magnifiquement préservée, la région dévoile des paysages tour à tour farouches, sereins ou pittoresques. Fière cité corsaire, Roscoff et son patrimoine vous livrent de magnifiques témoignages d'un passé florissant. Avec des plantes issues de lointains voyages, le jardin exotique vous transporte au coeur d'une surprenante flore, attestant de la douceur du climat.

]]></resum>
<prix>849</prix>

<url><![CDATA[http://opodo.service-voyages.com/SAI00512855/sejour.htm]]></url>
</sejour>

.....
</feed>

Et tu veux enregistrer tel quel le flux (genre comme une entrée de type BLOB) dans ta base ou trier les données (genre une ligne par sejour, et une colonne par donnée du séjour ?)

Lien vers le commentaire
Partager sur d’autres sites

Ce que je veux faire c'est créer une table Opodo par exemple et suivre l'architecture du flux avec ses items pour créer les champs id, pays, titre, form, ville, etc... dans l'ordre pour remplir ces champs ligne par ligne.

Lien vers le commentaire
Partager sur d’autres sites

salut Americas

voici un parseur que tu peux adapter avec les champs que tu veux une fois la structure de ta base créée

tu l'appelles en tache cron et çà marche tout seul

tu peux remplacer truncate par update ou autre chose

çà marche puisque je m'en sert

<?php
mysql_connect("tonroot","tabase","tonpass") or die("Impossible de se connecter");
mysql_select_db("tabase") or die("pas possible de trouver la base");
mysql_query("TRUNCATE TABLE `sejour`");

$file = "http://www.tonsite.com/tonxml.xml";

if(isset($file)) {
$title = "";
$url = "";
$curtag = "";

/** fonction startElement, déclenchée lorsque le parseur rencontre une balise XML du type **/
function startElement($parser, $name, $attrs) {
global $curtag, $id, $rubrique, $pays, $titre, $form, $arrive, $duree, $img, $resume, $prix, $url ;
$curtag = $name;
if ($name == "ID") $id = "";
if ($name == "RUBRIQUE") $rubrique = "";
if ($name == "PAYS") $pays = "";
if ($name == "TITRE") $titre = "";
if ($name == "FORM") $form = "";
if ($name == "ARRIVE") $arrive = "";
if ($name == "DUREE") $duree = "";
if ($name == "IMG") $img = "";
if ($name == "RESUME") $resume = "";
if ($name == "PRIX") $prix = "";
if ($name == "URL") $url = "";
}


/** fonction endElement, déclenchée lorsque le parseur rencontre une balise XML du type **/
function endElement($parser, $name) {
global $curtag, $id, $rubrique, $pays, $titre, $form, $arrive, $duree, $img, $resume, $prix, $url ;


$curtag = "";
if ($name == "URL") {
$rubrique = addslashes ($rubrique);
$pays = addslashes ($pays);
$titre = addslashes($titre);
$form = addslashes ($form);
$arrive = addslashes ($arrive);
$resume = addslashes($resume);

$query = "INSERT INTO sejour(id,rubrique,pays,titre,form,arrive,duree,img,resume,prix,url) VALUES('".$id."','".$rubrique."','".$pays."','".$titre."','".$form."','".$arrive."','".$duree."','".$img."','".$resume."','".$prix."','".$url."')";
$result = mysql_query($query);
}
}

/** fonction characterData, déclenchée lorsque le parseur rencontre des caractères, à l'intérieur d'un noeud XML **/
function characterData($parser, $data) {
global $curtag, $id, $rubrique, $pays, $titre, $form, $arrive, $duree, $img, $resume, $prix, $url ;
if ($curtag == "ID")
$id .= $data;
if ($curtag == "RUBRIQUE")
$rubrique .= $data;
if ($curtag == "PAYS")
$pays .= $data;
if ($curtag == "TITRE")
$titre .= $data;
if ($curtag == "FORM")
$form .= $data;
if ($curtag == "ARRIVE")
$arrive .= $data;
if ($curtag == "DUREE")
$duree .= $data;
if ($curtag == "IMG")
$img .= $data;
if ($curtag == "RESUME")
$resume .= $data;
if ($curtag == "PRIX")
$prix .= $data;
if ($curtag == "URL")
$url .= $data;
}

/** crée un nouveau parseur **/
$xml_parser = xml_parser_create();

xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);

/** enregistre les trois fonctions ci dessus **/
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
die("Impossible d'ouvrir l'URL...");
}

while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("erreur XML: %s à la ligne %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
mysql_close();

}
?>

[Edit captain_torche]Merci d'utiliser la balise CODEBOX pour les codes longs

Lien vers le commentaire
Partager sur d’autres sites

si tu veux je te donnes la ligne de commande à mettre dans cron pour lancer le script

et il y a quand meme une amelioration à apporter si tu utilises truncate: tester l'accessibilité de ton fichier xml sinon tu vas vider la base sans rien remettre dedans

Modifié par crindor
Lien vers le commentaire
Partager sur d’autres sites

si tu veux je te donnes la ligne de commande à mettre dans cron pour lancer le script

et il y a quand meme une amelioration à apporter si tu utilises truncate: tester l'accessibilité de ton fichier xml sinon tu vas vider la base sans rien remettre dedans

Toutes les informations à ce sujet sont les bienvenues :)

Ensuite je verrai comment adapter le script aux autres flux

D'ailleurs... je sais que beaucoup de webmasters utilisent les tâches cron pour réactualiser leurs caalogues... même ceux au format csv ou txt... et j'aimerais bien savoir comment faire ça car je perd un temps fou a charger tous les catalogues sur mon ordi pour les placer sur mon serveur une fois decompressés... car la plupart du temps j'ai des catalogues compressés au format gzip

Lien vers le commentaire
Partager sur d’autres sites

J'aimerai testé différents flux xml dans le style de celui proposé Americas (à part celui d'opodo, bien sûr)... Pouvez-vous me donner des URL (sans que j'ai besoin de m'inscrire à une quelconque régie ou autre) ?

Merci

Lien vers le commentaire
Partager sur d’autres sites

Il me reste plus qu'à apprendre comment manipuler les cron et ça va m'alléger sérieusement le travail de réactualisation des bases ;)

Les crons, c'est pas vraiment compliqué, c'est une tâche qui est générée à intervalles que tu programmes à l'avance. Soit ton hébergement te laisse accès à cette possibilité mais il y a plus simple, tu ouvres un compte gratuit sur webcron.org et tu programmes des tâches qui appellent tes urls aux périodes que tu souhaites

Patrick

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...