Aller au contenu

Faire un fichier xml à partir de php


Sujets conseillés

Posté

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.

Posté

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

Posté

d'après ce que je comprend du script, il faudrait ajouter

global $xml2;

au début de fonctionTexte

Posté

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 !!

  • 2 semaines plus tard...
Posté
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 :smartass:

Posté
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

Veuillez vous connecter pour commenter

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



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