Americas Posté 10 Octobre 2006 Posté 10 Octobre 2006 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
objectifweb Posté 11 Octobre 2006 Posté 11 Octobre 2006 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
smile Posté 11 Octobre 2006 Posté 11 Octobre 2006 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.
adn Posté 11 Octobre 2006 Posté 11 Octobre 2006 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.
robinsonvendredi Posté 11 Octobre 2006 Posté 11 Octobre 2006 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.
Americas Posté 11 Octobre 2006 Auteur Posté 11 Octobre 2006 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 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
Vincent Posté 11 Octobre 2006 Posté 11 Octobre 2006 Americas, Donnes la structure de ton flux et la structure de ta table si tu as une idée précise en tête
Americas Posté 11 Octobre 2006 Auteur Posté 11 Octobre 2006 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
Régis Posté 11 Octobre 2006 Posté 11 Octobre 2006 -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...
Jeromnimo Posté 11 Octobre 2006 Posté 11 Octobre 2006 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 ?)
Régis Posté 11 Octobre 2006 Posté 11 Octobre 2006 Le lien était fonctionnel pour moi ;-) (par contre c'est long a venir ) Merci 'Jeromnimo', Maintenant c'est fonctionnel... et j'ai pu le télécharger.
Americas Posté 11 Octobre 2006 Auteur Posté 11 Octobre 2006 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.
crindor Posté 11 Octobre 2006 Posté 11 Octobre 2006 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 <?phpmysql_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
Americas Posté 11 Octobre 2006 Auteur Posté 11 Octobre 2006 Génial Crindor Merci 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
crindor Posté 11 Octobre 2006 Posté 11 Octobre 2006 (modifié) 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é 11 Octobre 2006 par crindor
Americas Posté 11 Octobre 2006 Auteur Posté 11 Octobre 2006 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
Régis Posté 19 Octobre 2006 Posté 19 Octobre 2006 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
objectifweb Posté 19 Octobre 2006 Posté 19 Octobre 2006 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
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant