Hello,

Je sens que je suis proche du but, mais je cale à la toute fin ... Smiley decu
(Par ailleurs, j'ai aussi l'impression de ne pas avoir utilisé la bonne méthode Smiley 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.
Bonjour à toi !

Ce n'est pas très pédagogique ce que je vais faire, mais comme tu es ouvert à toute autre proposition, et que de mon côté, je ne me suis pas trop penché sur les parseurs XML inclus dans PHP (tout simplement car je n'y ai pas accès...), je vais te proposer la solution qui marche (enfin chez moi elle marche donc...) en utilisant DomIt (merci kzone du tuyau Smiley cligne )

Donc le principe de DomIt, c'est que c'est un paseur XML écrit tout en PHP, donc tu télécharges les sources disponibles au lien que j'ai mis plus haut, tu les copies sur ton serveur, en faisant gaffe de bien leur donner les droits en exécution, et hop ! ça marche...

Voilà maintenant le code qui permet de faire ce que tu veux :

<?php
// ici fais gaffe à mettre le bon répertoire hein !
require_once('domit_1_1/xml_domit_include.php');

// instanciation du document à lire
$docIn =& new DOMIT_Document();
$docInFilename = "http://www.enseignons.be/services/mail/enseignonsbe.xml";
if(!($docIn->loadXML($docInFilename))) {
	echo "<html><body>Problem loading $docInFilename</body></html>";
}

// instanciation du document dans lequel écrire
// NB : mon code ne marche que si ce document existe déjà
// je te laisse bidouiller pour le cas ou il n'existe pas encore...
$docOut =& new DOMIT_Document();
$docOutFilename = "contacttest.ctt";
$xmlDecl =& $docOut->createProcessingInstruction('xml', 'version="1.0"');
$docOut->appendChild($xmlDecl);
$rootElement =& $docOut->createElement('messenger');
$docOut->appendChild($rootElement);
$serviceElement =& $docOut->createElement('service');
$serviceElement->setAttribute('name', '.NET Messenger Service');

// Ici on demande de pointer sur tous les chemins du type "/Usernames/Username" dans le fichier source
$contactsNodeSet =& $docIn->getElementsByPath("/Usernames/Username");
if ($contactsNodeSet != NULL) {
	for ($i = 0; $i < $contactsNodeSet->getLength(); $i++) {
		$tempContact =& $contactsNodeSet->item($i);
		$text =& $tempContact->firstChild->getData();

		// Pour chaque élément extrait, on copie sa valeur dans un noeud temporaire
		$tempElement =& $docOut->createElement('contact');
		$tempElement->setAttribute('type', '1');
		$tempElement->appendChild($docOut->createTextNode($text));
		// Puis on "attache" ce noeud temporaire au parent (en l'occurence le noeud "service"
		$serviceElement->appendChild($tempElement);
	}
	// On attache le noeud service au noeud racine, et on sauve !
	$rootElement->appendChild($serviceElement);
	echo $docOut->toNormalizedString(true);
	$docOut->saveXML($docOutFilename, true);
} else {
	echo "<html><body>Problem reading $docInFilename</body></html>";
}
?>
salut, je ne sais pas si tu as trouvé ou pas, et est ce que la solution de "jde3" marche ou pas, mais j'ai une solution qui marche mais en XSLT, je suis pas très fort en php, donc si tu es interessé, manifeste toi Smiley langue