Tri d'un fichier xml
Visiteur
Boosteur Inactif
J'ai un fichier xml (utilisé pour un lecteur de musiques: dewplayer) qui se présente de la façon suivante:
Code XML :
<playlist> <trackList> <track> <location>lien_vers_la_musique_A</location> <title>Titre A</title> </track> <track> <location>lien_vers_la_musique_B</location> <title>Titre B</title> </track> <track> <location>lien_vers_la_musique_C</location> <title>Titre C</title> </track> </trackList> </playlist>
Je souhaiterais pouvoir trier ce fichier en fonction du titre... Je pense qu'il faut utiliser le xsl, mais je n'y arrive pas!
Si on pouvais le faire en PHP, ce serait pas mal! (enfin je veux dire qu'il se mette a jour seul a chaque rajout de titre, qu'on ne soit pas obligés de le modifier a chaque fois...)
Merci a ceux qui pourront m'aider!
Édité par Visiteur Le 02/05/2010 à 12h12
ReidLos Membre non connecté
-
Modérateur
- Voir le profil du membre ReidLos
- Inscrit le : 27/02/2009
- Site internet
- Groupes :
-
Equipe Développement
http://www.phpboost.com/forum/topic-9470+3-0-alpha-module-slide.php
Tu peux regarder dans admin_slide.php et slide_fonction.php
Si tu t'y connais en php tu devrais t'en sortir
Visiteur
Boosteur Inactif
edit: j'ai repéré le bout de code dans lequel tu régénère le code xml mais je ne comprends pas tout... Il trie les données?
Je ne vois pas comment l'adapter a mon cas... j'ai une petite idée, mais ca va me prendre au moins 100 lignes... Donc bon, si je pouvais faire mieux... ^^
En tout cas, merci pour ton aide! (Si tu as besoin de plus d'informations sur mon code xml, je le mettrai en entier
)
Édité par Visiteur Le 02/05/2010 à 22h09
ReidLos Membre non connecté
-
Modérateur
- Voir le profil du membre ReidLos
- Inscrit le : 27/02/2009
- Site internet
- Groupes :
-
Equipe Développement
C'est bien ce que tu veux faire ? Ou tu veux les lires ?
Je te propose :
Code PHP :
function gener_xml($array = null, $execute = false) { if($execute) { $file = 'mon_xml.xml'; $file_path = PATH_TO_ROOT . '/' . $file; $contents = '<playlist>' . "n"; $contents .= '<trackList>' . "n"; foreach($array as $key => $value) { $contents .= '<track>' . "n"; $contents .= '<location>'.$value['location'].'</location>' . "n"; $contents .= '<title>'.$value['title'].'</title>' . "n"; $contents .= '</track>' . "n"; } $contents .= '</trackList>' . "n"; $contents .= '</playlist>' . "n"; import('io/filesystem/file'); $cache_xml = new File($file_path, WRITE); //Suppression du fichier (si il existe) $cache_xml->delete(); //Ouverture du fichier $cache_xml->open(); //Verrouillage du fichier (comme un mutex si une autre tâche travaille actuellement dessus) $cache_xml->lock(); //Ecriture de son contenu $cache_xml->write($contents); //Déverrouillage du fichier (on relâche le mutex) $cache_xml->unlock(); //Fermeture du fichier $cache_xml->close(); //On lui met les autorisations nécessaires de façon à pouvoir par la suite le lire (4) et le supprimer (2), soit 4 + 2 = $cache_xml->change_chmod(0666); } }
Ensuite tu peux essayer d'appeller la fonction comme ca :
Code PHP :
Tes données proviennent d'un formulaires ?
A la racine de son site tu devrais avoir un fichier nommé mon_xml.xml, c'est bien le cas ?
Édité par ReidLos Le 02/05/2010 à 22h44
Visiteur
Boosteur Inactif
J'ai effectivement un fichier playlist.xml dans le dossier 'player'...
Le formulaire (placé dans 'media.php') envoie les données au fichier xml (que j'aimerais donc trier comme tu l'avais compris ^^)
je vais tester ton code! merci!
Édité par Visiteur Le 02/05/2010 à 23h38
ben.popeye Membre non connecté
-
Modérateur
- Voir le profil du membre ben.popeye
- Inscrit le : 04/08/2005
- Site internet
- Groupes :
-
Equipe Historique
Code PHP :
$cache_xml->lock();
Code PHP :
$cache_xml->unlock();
On les utilise à un seul endroit, c'est pour être sûr de faire une opération synchrone, mais c'est très rare. En principe tu n'as pas besoin de synchroniser, il n'y a a priori pas de raison que plusieurs exécutions de page touchent au même fichier en même temps.
Un problème, une question ? Cherchez dans la FAQ ou la documentation. Si vous ne trouvez pas la réponse, demandez du support sur le forum.
Bjarne Stroustrup, inventeur du C++ :"There are two ways to write error-free programs; only the third works."
ReidLos Membre non connecté
-
Modérateur
- Voir le profil du membre ReidLos
- Inscrit le : 27/02/2009
- Site internet
- Groupes :
-
Equipe Développement
Ce que je t'ai donné sert a créer un fichier XML a partir d'un tableau, c'est ce que tu souhaite ?
Tu veux les trier pour en faire quoi ?
Édité par ReidLos Le 02/05/2010 à 22h51
ReidLos Membre non connecté
-
Modérateur
- Voir le profil du membre ReidLos
- Inscrit le : 27/02/2009
- Site internet
- Groupes :
-
Equipe Développement
ben.popeye :
Juste une remarque Reidlos, il y a fort à parier que les lignes suivantes ne servent à rien :
On les utilise à un seul endroit, c'est pour être sûr de faire une opération synchrone, mais c'est très rare. En principe tu n'as pas besoin de synchroniser, il n'y a a priori pas de raison que plusieurs exécutions de page touchent au même fichier en même temps.
Code PHP :
$cache_xml->lock();
Code PHP :
$cache_xml->unlock();
On les utilise à un seul endroit, c'est pour être sûr de faire une opération synchrone, mais c'est très rare. En principe tu n'as pas besoin de synchroniser, il n'y a a priori pas de raison que plusieurs exécutions de page touchent au même fichier en même temps.
Merci pour ta remarque Ben

J'utilise ce code pour éviter que la création du fichier puisse ne pas aboutir si deux personnes visite une page alors que le fichier XML n'est pas créer, je sais que c'est presque impossible, mais vaut mieux être sur que la création du fichier s'effectue bien ... Je suis bien sur à ton écoute, et si tu pense que cela ne sert a rien, et que ce cas précis n'est pas possible, je ferai la modification dans mes fichiers
ben.popeye Membre non connecté
-
Modérateur
- Voir le profil du membre ben.popeye
- Inscrit le : 04/08/2005
- Site internet
- Groupes :
-
Equipe Historique
Un problème, une question ? Cherchez dans la FAQ ou la documentation. Si vous ne trouvez pas la réponse, demandez du support sur le forum.
Bjarne Stroustrup, inventeur du C++ :"There are two ways to write error-free programs; only the third works."
Visiteur
Boosteur Inactif
Le voici dans son intégralité:
Code XML :
<?xml version="1.0" encoding="UTF-8"?> <playlist version="1" xmlns="http://xspf.org/ns/0/"> <title>Playlist</title> <creator>patator63</creator> <link>http://www.patator63.fr/</link> <info></info> <image></image> <trackList> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/07-Before_the_Storm-Blues_Saraceno-Never_Look_Back.mp3/</location> <title>Blues Saraceno - Before The Storm</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/02_Perpetual_Burn.mp3/</location> <title>Jason Becker - Perpetual Burn</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/08_-_vivaldi_tribute.mp3/</location> <title>Patrick Rondat - Vivaldi Tribute</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/09_Sweet_Child_O_Mine.mp3/</location> <title>Gun's N Roses - Sweet Child O Mine</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/03_Im_alright.mp3/</location> <title>Neil Zaza - I'm Alright</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/Patrick_Rondat_-_05_-_French_Message.mp3/</location> <title>Patrick Rondat - French Message</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/05_Smoke_on_the_Water_Deep_Purple_Machine_Head_Rock.mp3/</location> <title>Deep Purple - Smoke On The Water</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/09_This_Side_of_Hell_Damn_Yankees_Dont_Tread_Rock.mp3</location> <title>Damn Yankees - This Side of Hell Damn Yankees Dont Tread Rock</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/06_Silence_Is_Broken_Damn_Yankees_Dont_Tread_Rock.mp3</location> <title>Damn Yankees - Silence Is Broken Damn Yankees Dont Tread Rock</title> </track> </trackList> </playlist>
J'aimerais effectuer un tri selon la balise 'title' afin d'obtenir le fichier suivant:
Code XML :
<?xml version="1.0" encoding="UTF-8"?> <playlist version="1" xmlns="http://xspf.org/ns/0/"> <title>Playlist</title> <creator>patator63</creator> <link>http://www.patator63.fr/</link> <info></info> <image></image> <trackList> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/07-Before_the_Storm-Blues_Saraceno-Never_Look_Back.mp3/</location> <title>Blues Saraceno - Before The Storm</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/06_Silence_Is_Broken_Damn_Yankees_Dont_Tread_Rock.mp3</location> <title>Damn Yankees - Silence Is Broken Damn Yankees Dont Tread Rock</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/09_This_Side_of_Hell_Damn_Yankees_Dont_Tread_Rock.mp3</location> <title>Damn Yankees - This Side of Hell Damn Yankees Dont Tread Rock</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/05_Smoke_on_the_Water_Deep_Purple_Machine_Head_Rock.mp3/</location> <title>Deep Purple - Smoke On The Water</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/09_Sweet_Child_O_Mine.mp3/</location> <title>Gun's N Roses - Sweet Child O Mine</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/02_Perpetual_Burn.mp3/</location> <title>Jason Becker - Perpetual Burn</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/03_Im_alright.mp3/</location> <title>Neil Zaza - I'm Alright</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/Patrick_Rondat_-_05_-_French_Message.mp3/</location> <title>Patrick Rondat - French Message</title> </track> <track> <location>http://sd-2.archive-host.com/membres/playlist/62112033964957525/08_-_vivaldi_tribute.mp3/</location> <title>Patrick Rondat - Vivaldi Tribute</title> </track> </trackList> </playlist>
Enfin, j'aimerais qu'a chaque fois que je rajoute une musique (grace au formulaire), le fichier se mette a jour automatiquement (c'est a dire que la nouvelle musique soit placée non pas a la fin du fichier comme c'est le cas actuellement mais en fonction de son titre...
Édité par Visiteur Le 02/05/2010 à 23h18
ReidLos Membre non connecté
-
Modérateur
- Voir le profil du membre ReidLos
- Inscrit le : 27/02/2009
- Site internet
- Groupes :
-
Equipe Développement
Il faudrait lire le fichier (environ deux secondes déjà ), lire les données, les triers, et recrèer le fichier...
Il faudrait plutot stocker ces données dans une bdd non ? Comme ca tu te contente de créer le fichier..
Visiteur
Boosteur Inactif
Sinon, je vais voir mais je ne crois pas que je puisse trier directement avec le lecteur... C'est vrai que ca serait beaucoup plus simple! ^^
ReidLos Membre non connecté
-
Modérateur
- Voir le profil du membre ReidLos
- Inscrit le : 27/02/2009
- Site internet
- Groupes :
-
Equipe Développement
Actuellement ton formulaire ressemble a quoi ?
Visiteur
Boosteur Inactif
Code PHP :
if(isset($_POST['sendmp3'])) { $comp=substr($_POST['loc'], -4, 4); if(!empty($_POST['loc']) && !empty($_POST['nom']) && $comp=='.mp3') { /* TODO: regex sur les champs */ $xml="tt<track>ttntt <location>".$_POST['loc']."</location>ntt <title>".$_POST['nom']."</title>ntt</track>nnt</trackList>n</playlist>"; $pl = '../player/playlist.xml'; $fi=fopen($pl, 'r'); $play = fread($fi, filesize($pl)); fclose($fi); $play=str_replace('</trackList>', '', $play); $play=str_replace('</playlist>', '', $play); $fo=fopen($pl, 'w'); fwrite($fo, $play); fwrite($fo, $xml); fclose($fo); echo '<p style="font-size: 9px; text-align:center;">MP3 ajouté</p>'; } else { if($comp!=='.mp3') { echo '<p style="font-size: 9px; text-align:center;">Le lien doit se termnier par .mp3 !</p>'; } else { echo '<p style="font-size: 9px; text-align:center;">Tous les champs doivent etre remplit !</p>'; } } } ?> <script language="JavaScript"> <!-- function display(calque) { document.getElementById(calque).style.display=document.getElementById(calque).style.display=="none"?"block":"none"; } //--> </script> <div align=center> <input type=button onclick=display('calque'); value="Ajouter une musique à la playlist" style="color:#2e3b5f;"> <div id="calque" style="display: none;"><br/> <form action="media.php" method="POST"> <tr><td><font color="#2e3b5f">Lien: </td> <td><input type="text" name="loc" style="color:#2e3b5f;"/></td></tr> <tr><td>Titre: </td> <td><input type="text" name="nom" style="color:#2e3b5f;"/></td></tr> <tr><td> </td></tr> </table> <input type="submit" name="sendmp3" value=" Valider " style="color:#2e3b5f;"/></font> </form></div></div><br/>
A ca ^^
Ce n'est pas moi qui ai tout fait... Un collègue m'a aidé...
Pour la bdd, je vois très bien comment ca se passerait! Seulement, au niveau de l'implémentation... lol
Édité par Visiteur Le 02/05/2010 à 23h35
ReidLos Membre non connecté
-
Modérateur
- Voir le profil du membre ReidLos
- Inscrit le : 27/02/2009
- Site internet
- Groupes :
-
Equipe Développement
Je te ferais un module, demain dans la soirée ou bien après demain selon le temps que je dispose...
Tu t'occupera de le tester ^^
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie