nizouille Posté 20 Août 2007 Posté 20 Août 2007 Hello, Je sens que je suis proche du but, mais je cale à la toute fin ... [decu] (Par ailleurs, j'ai aussi l'impression de ne pas avoir utilisé la bonne méthode [smile] ) Je m'explique : j'ai un fichier xml de contacts, et j'aimerais en faire un fichier ctt de contacts messenger (en gros, c'est un simple fichier xml) pour mon site web pour les enseignement . Voilà où j'en suis : je parse le fichier xml, et j'essaie d'en extraire ce que je veux, mais ça coince quand je veux recréer le fichier xml. Il me prend tout sauf les données qui sont parsées (qui sont pourtant parsées correctement puisque je peux en faire un echo). S'il y a plus simple, je suis preneur, je suis un vrai débutant en xml : <?php $fichier = "http://www.enseignons.be/services/mail/enseignonsbe.xml"; // Ma propre fonction de traitement des balises ouvrantes function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs) { // En fait... nous nous conteterons de mémoriser le nom de la balise // afin d'en tenir compte dans la fonction "fonctionTexte" global $derniereBaliseRencontree; $derniereBaliseRencontree = $nomBalise; } // Ma propre fonction de traitement des balises fermantes function fonctionBaliseFermante($parseur, $nomBalise) { // On oublie la dernière balise rencontrée global $derniereBaliseRencontree; $derniereBaliseRencontree = ""; } // Ma propre fonction de traitement du texte // qui est appelée par le "parseur" function fonctionTexte($parseur, $texte) { global $derniereBaliseRencontree; // Selon les cas, nous affichons le texte // ou nous proposons un lien // ATTENTION: Par défaut les noms des balises sont // mises en majuscules switch ($derniereBaliseRencontree) { case "USERNAME": $xml2 ='<contact type="1">$texte</contact>'; break; } } // Création du parseur XML $parseurXML = xml_parser_create(); // Je précise le nom des fonctions à appeler // lorsque des balises ouvrantes ou fermantes sont rencontrées xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante" , "fonctionBaliseFermante"); // Je précise le nom de la fonction à appeler // lorsque du texte est rencontré xml_set_character_data_handler($parseurXML, "fonctionTexte"); // Ouverture du fichier $fp = fopen($fichier, "r"); if (!$fp) die("Impossible d'ouvrir le fichier XML");$xml = '<?xml version="1.0"?><messenger> <service name=".NET Messenger Service"> <contactlist>'; // Lecture ligne par ligne while ( $ligneXML = fgets($fp, 1024)) { // Analyse de la ligne // REM: feof($fp) retourne TRUE s'il s'agit de la dernière // ligne du fichier. xml_parse($parseurXML, $ligneXML, feof($fp)) or die("Erreur XML"); }$xml .= $xml2;$xml .= '</contactlist> </service> </messenger>'; xml_parser_free($parseurXML);$fp = fopen("contacttest.ctt", 'w+');fputs($fp, $xml); fclose($fp);?> Merci de votre aide.
Leonick Posté 21 Août 2007 Posté 21 Août 2007 ca veut dire quoi "ça coince" ? il ne faut pas oublier d'envoyer les bons en-têtes pour le fichier, et pas en text/html
nizouille Posté 21 Août 2007 Auteur Posté 21 Août 2007 Ca écrit tout dans un fichier comme je m'y attendais, sauf la partie "parsée" $xml2 ='<contact type="1">$texte</contact>';
Leonick Posté 21 Août 2007 Posté 21 Août 2007 il n'y a pas de return à la fonction, donc le contenu ne sert à rien
nizouille Posté 21 Août 2007 Auteur Posté 21 Août 2007 Donc comment je peux faire concrètement ? Désolé mais je débute .. :s
Leonick Posté 21 Août 2007 Posté 21 Août 2007 d'après ce que je comprend du script, il faudrait ajouter global $xml2; au début de fonctionTexte
nizouille Posté 21 Août 2007 Auteur Posté 21 Août 2007 Rah super, ça marche. par contre ça ne me retourne qu'un seul résultat, tu sais pourquoi ? Un tout tout grand merci pour ton aide !!
Leonick Posté 29 Août 2007 Posté 29 Août 2007 Toujours pas d'idée ? parce que la concaténation de texte est faite en dehors du while et donc seule la dernière valeur est prise
nizouille Posté 29 Août 2007 Auteur Posté 29 Août 2007 Et comment pourrais-je le mettre dans le while sans tout foutre en l'air (désolé de mes questions de newbie) ...
Nsg Posté 30 Août 2007 Posté 30 Août 2007 S'il y a plus simple, je suis preneur, je suis un vrai débutant en xml oui, il y a vraiement beaucoup plus simple : avec xslt on transforme un fichier xml en à peut près ce qu'on veut, notamment en d'autres fichiers xml apprendre xslt (pour les transformations) et dtd ou xsl (pour la définition et validation) vont de paire avec l'apprentissage du xml certains aspects sont un peut lourds mais c'est un bon investissement. il y a beaucoup de doc sur xslt sur le net donc je passe les explications sur xslt, surtout qu'ici ça devrait aller tout seul. ici le fichier à transformer (http://www.enseignons.be/services/mail/enseignonsbe.xml) est simple et valide (et un peut "spécial" aussi mais bon) vu la forme des fichiers de contacts msn , et vu qu'on n'a besoin qu'un élément (l'adresse email) le fichier xsl est basique. ici on peut faire avec 2 "templates" (un seul aurait pu suffire) : - un petit correspondant à chaque ligne "Utilisateur" qui va écrire les ligne "contact" avec une commande pour récuperer l'email - un autre correspondant à la racine "Utilisateurs" ou "/" de ton fichier xml initial. ce template va ajouter tout ce qu'il y a au-dessus et au-dessous des ligne contacts ça donne ça : fichier Utilisateurs2msn.xsl <?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" indent="yes" encoding="UTF-8" /> <xsl:template match="/"> <messenger> <service name=".NET Messenger Service"> <contactlist> <xsl:apply-templates /> </contactlist> </service> </messenger> </xsl:template> <xsl:template match="Username"> <contact type="1"><xsl:value-of select="." /></contact> </xsl:template></xsl:stylesheet> Remarques : ici <xsl:value-of select="." /> récupère la valeur de l'élément courant "." == "Utilisateur" <xsl:apply-templates /> est une directive indiquant d'appliquer les autre templates aux élements enfants directs qui se trouvent à l'endroit analogue dans le fichier xml à transformer. cette feuille xslt va maintenant servir a la transformation en un fichier de contact msn pour bien faire il faudrait éventuellement valider le fichier xml avec un shéma xsd et traiter les erreurs... sans ça en php5 (php4 c'est un peu différent) ça se limite au code suivant : $xml = new DOMDocument(); // objet pour fichier xml à transformer $xml->load("enseignonsbe.xml"); // qu'on charge $xsl = new DOMDocument(); // objet pour feuille de style $xsl->load("Utilisateurs2msn.xsl"); $proc = new XSLTProcessor; // nouveau processeur xslt $proc->importStyleSheet($xsl); // qui charge l'objet xml contenant la feuille $proc->transformToURI($xml, 'file:///chemin/contactsMsn.ctt'); // on transforme et on sauve Donc côté php c'est très simple et l'on a pas à écrire un nouveau parser à chaque fois que l'on est confronter à un nouveau type de fichier xml à transformer. Par contre l'écriture des feuilles de style et des shémas sont généralement bien plus complexes qu'ici. Ceci dit il y a beaucoup de fichiers xml définis par des shémas ou dtd "classiques" et on trouve alors souvent des feuilles xslt pour les transformer en d'autres types de fichier. A+ Nsg
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant