#1 Le 09/07/2008, à 23:08
- ToMs
[Résolu]traiter un fichier xml simple en bash
Bonsoir a tous
bonjour à tous,
je dispose d'un fichier xml sous ce format
<playlist version="1">
<trackList>
<track>
<title> 18 avril : La Bellevilloise</title>
<creator>BARTH</creator>
<location>nz barth.mp3</location>
</track>
<track>
<title> 18 avril : La Bellevilloise</title>
<creator>MOLECULE</creator>
<location>nz Molecule.mp3</location>
</track>
</trackList>
</playlist>
je cherche iun moyen simple de récuperer les valeurs entre les balises <title> ; <creator> ; <location> et les mettrent dans des variables associées
jai essayé plusieurs chose notamment cette ligne de commande ;
sed -n -r 's%<title>(.*)<\/title>%\1%p' monfichier.xml
mais elle me renvoit la liste de toute les valeurs <title> or je veux mettre chacune des valeurs dans une variable
pour pouvoir la traiter par la suite
j'ai essayé le bash , ainsi que le perl sans trouver mon bonheur
si quelqu"un a une idée
d'avance merci
Dernière modification par ToMs (Le 15/07/2008, à 21:38)
On est toujours le newbie de quelqu'un ...
Hors ligne
#2 Le 09/07/2008, à 23:21
- redisded
Re : [Résolu]traiter un fichier xml simple en bash
Bonsoir,
en bash, ceci devrait fonctionner :
titres=$(cat "ton_fichier" | grep <title> | sed -e 's/<title>//g' -e 's/<\/title>//g'
createurs=$(cat "ton_fichier" | grep <creator> | sed -e 's/<creator>//g' -e 's/<\/creator>//g'
emplacements=$(cat "ton_fichier" | grep <location> | sed -e 's/<location>//g' -e 's/<\/location>//g'
En esperant que cela puisse t'aider ...
EDIT : Arf si je comprend bien, tu veut que chaques variables contienne un seul titre,créateur, ou emplacement...
dsl, j'avais mal lu la première fois
Je viens de faire un petit truc similaire ici :
http://forum.ubuntu-fr.org/viewtopic.ph … 4#p1916574
tu devrais pouvoir l'adapter facilement à ton cas, si tu ne comprend pas tout, n'hésite pas à demander
Dernière modification par redisded (Le 09/07/2008, à 23:25)
Hors ligne
#3 Le 11/07/2008, à 14:20
- ToMs
Re : [Résolu]traiter un fichier xml simple en bash
Merci redisded pour le tuyau , j'ai regardé ce que tu as fais ca ressemble de trés prés a ce que je veux faire n'ayant pas le fichier xml de base pour ton script j'ai un peu de mal a saisir ...
si j'ai bien compris dans cette portion de code tu arrives a séparer les valeur récuperer dans le fichier xml
cat $FXML | grep "<index>" | sed -e 's/<index>//g' -e 's/<\/index//g' -e 's/ //g' -e 's/>//g' >numeros
nb=1
for i in $(cat "numeros") ; do
titre=$(cat $FXML | grep "<bigTitle>" | sed -e 's/<bigTitle>//g' -e 's/<\/bigTitle>//g' -e 's/ //g' -e 's/ /_/g' | head -$nb | tail -1)
date=$(cat $FXML | grep "<startDate>" | sed -e 's/<startDate>//g' -e 's/<\/startDate>//g' -e 's/\([[:digit:]][[:digit:]][[:digit:]][[:digit:]]\)-\([[:digit:]][[:digit:]]\)-\([[:digit:]][[:digit:]]*\)/\3-\2-\1/g' -e 's/T/@/g' -e 's/ //g' | head -$nb | tail -1)
echo "$i $titre $date" >>liste_emissions
nb=$(( $nb + 1 ))
done
CHXEMI=$(zenity --list --width=400 --height=500 \
--title="Arte+7 recorder" \
--text="Veuillez sélectionner l'émission :" \
--column="Numéro" --column="Emission" --column="Date" $(cat "liste_emissions") )
annuler
NUMEMI=`echo "$CHXEMI" | awk -F":" '{print $1}'`
TITREBASE=`echo "$CHXEMI" | awk -F":" '{print $2}' | sed 's/^\s*//' `
PAGE=`cat liste | grep -A 1 -m1 "$NUMEMI"":" | grep "<targetURL>" | awk -F'<targetURL>' '{print $2}' | awk -F'</targetURL>' '{print $1}'`
info_emission
Peux tu me dire ou puis-je trouver le fichier xml dont tu te sers pour ton script
d'avance merci
On est toujours le newbie de quelqu'un ...
Hors ligne
#4 Le 11/07/2008, à 15:32
- redisded
Re : [Résolu]traiter un fichier xml simple en bash
Ce n'est pas mon script, c'est celui de Beudbeud pour télécharger les emissions du site Arte+7.
J'ai regardé pour retrouver le fichier mais faut remonter plein de trucs dans le script et j'ai un peu la flemme alors je vais essayer de te détailler la partie qui t'interesse :
cat $FXML | grep "<index>" | sed -e 's/<index>//g' -e 's/<\/index//g' -e 's/ //g' -e 's/>//g' >numeros
Affiche le fichier en question, ne garde que le numéro de l'emissions (premier parametre à isoler pour le script) contenu entre les balises index, et supprime ces balises pour qu'il ne reste que le numéro; ensuite, copie le résultat dans le fichier numero.
nb=1
Initialise la variable nb qui servira de compteur dans la boucle suivante.
for i in $(cat "numeros") ; do
pour chaque ligne du fichier numero (donc pour chaque numéro d'emission trouvé précédemment), faire :
titre=$(cat $FXML | grep "<bigTitle>" | sed -e 's/<bigTitle>//g' -e 's/<\/bigTitle>//g' -e 's/ //g' -e 's/ /_/g' | head -$nb | tail -1)
rechercher dans le fichier d'origine les titres affichés entre balises <bigtitle>, supprimer les balises, pour qu'il ne reste que les titres,remplacer les espaces par des _ , et n'afficher que la ligne correspondant au numéro de la variable nb.
date=$(cat $FXML | grep "<startDate>" | sed -e 's/<startDate>//g' -e 's/<\/startDate>//g' -e 's/\([[:digit:]][[:digit:]][[:digit:]][[:digit:]]\)-\([[:digit:]][[:digit:]]\)-\([[:digit:]][[:digit:]]*\)/\3-\2-\1/g' -e 's/T/@/g' -e 's/ //g' | head -$nb | tail -1)
Idem que précédemment avec la date de l'emission + une petite manip pour modifier l'ordre de la date.
echo "$i $titre $date" >>liste_emissions
afficher $i (le numero) $titre $date et copier le résultat à la suite du ficher emissions.
nb=$(( $nb + 1 ))
done
Incrémenter la variable nb de 1.
Fin de la boucle.
De cette manière, pour chaque occurence trouvée d'une premiere variable, le script va ensuite chercher le résultat des variables correspondantes et créer une ligne pour chaque mp3 dans un fichier texte, avec toutes les infos du mp3 en question.
Je ne détaille pas la suite car je ne pense pas que tu l'utilisera, mais si je me trompe, n'hésite pas à demander.
De même, je débute moi meme en script shell, alors si je n'ai pas été clair sur certains points, n'hésite pas à me demander des précisions.
Hors ligne
#5 Le 11/07/2008, à 16:18
- beudbeud
Re : [Résolu]traiter un fichier xml simple en bash
tiens une partie du fichier xml utilisé dans mon script
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<videos language="fr" startIndex="25">
<video>
<index>0</index>
<bigTitle>Zoom Europa</bigTitle>
<title>Zoom Europa</title>
<startDate>2008-07-04T19:00:00</startDate>
<offlineDate>2008-07-11T19:00:48</offlineDate>
<previewPictureURL>http://plus7.arte.tv/i18n/content/tv/05__Programmes/plus7/generic/zoomeuropa__fr.jpg/1699668,property=imageData.jpg</previewPictureURL>
<previewVideoURL>http://dl.plus7.arte.tv/arteprod/A7_SGT_ENC_21_038837-026-B_TE_LQ_FR.flv?obj=6c18a9d35d72608fb3eb45e0fd86f2f7</previewVideoURL>
<targetURL>http://plus7.arte.tv/fr/detailPage/1697660,CmC=2112208,scheduleId=2073156.html</targetURL>
</video>
<video>
<index>1</index>
<bigTitle>Tracks</bigTitle>
<title>Tracks</title>
<startDate>2008-07-04T00:15:00</startDate>
<offlineDate>2008-07-12T00:14:56</offlineDate>
<previewPictureURL>http://plus7.arte.tv/i18n/content/tv/05__Programmes/plus7/2008/27/04__07__08__tracks.jpg/2103986,property=imageData.jpg</previewPictureURL>
<previewVideoURL>http://dl.plus7.arte.tv/arteprod/A7_SGT_ENC_21_039021-002-A_TE_LQ_FR.flv?obj=b5831fb01ed2e108c18d1c80fb0b10e1</previewVideoURL>
<targetURL>http://plus7.arte.tv/fr/detailPage/1697660,CmC=2105766,scheduleId=2073168.html</targetURL>
</video>
<video>
<index>2</index>
<bigTitle>Inde 2025</bigTitle>
<title>Inde 2025</title>
<startDate>2008-07-05T10:00:00</startDate>
<offlineDate>2008-07-12T09:59:55</offlineDate>
<previewPictureURL>http://plus7.arte.tv/i18n/content/tv/05__Programmes/plus7/2008/17/22__04__08__indien.jpg/2003768,property=imageData.jpg</previewPictureURL>
<previewVideoURL>http://dl.plus7.arte.tv/arteprod/A7_SGT_ENC_21_037910-000-A_TE_LQ_FR.flv?obj=1579c61bd526956f61350ec82a43de9c</previewVideoURL>
<targetURL>http://plus7.arte.tv/fr/detailPage/1697660,CmC=2081586,scheduleId=2084014.html</targetURL>
</video>
<video>
<index>3</index>
<bigTitle>La température grimpe</bigTitle>
<title>La température grimpe</title>
<startDate>2008-07-05T12:00:00</startDate>
<offlineDate>2008-07-12T12:00:56</offlineDate>
<previewPictureURL>http://plus7.arte.tv/i18n/content/tv/05__Programmes/plus7/2008/07/12__02__08__patientklima.jpg/1918860,property=imageData.jpg</previewPictureURL>
<previewVideoURL>http://dl.plus7.arte.tv/arteprod/A7_SGT_ENC_21_037825-000-A_TE_LQ_FR.flv?obj=4bb4ed1ce16ba3a02bd5104537e4646d</previewVideoURL>
<targetURL>http://plus7.arte.tv/fr/detailPage/1697660,CmC=2081588,scheduleId=2084018.html</targetURL>
</video>
tu rajoute un ligne au debut du script de redisded avec
$FXML=le nom du fichier xml qui contient les info ci dessus
Télécharger les émissions de Arte +7 avec Arte +7 recorder
Theme pour Ubuntu Bisigi Project
Vostro 1510 Ubuntu 10.04
Hors ligne
#6 Le 11/07/2008, à 19:42
- ToMs
Re : [Résolu]traiter un fichier xml simple en bash
merci bien pour les explications , un peu déçu car je ne pourrais pas utiliser la même technique n'ayant pas dans mon fichier de balise index incluant le numero.
Néanmoins il y a une balise <track></track> qui reviens avant chaque "bloc" d'information
pensez vous qu'il soit possible d'utiliser cette balise pour m'aider a récupérer les valeurs et surtout les organiser afin de les utiliser plus facilement dans la suite de mon script ?
Thanks
On est toujours le newbie de quelqu'un ...
Hors ligne
#7 Le 12/07/2008, à 02:40
- redisded
Re : [Résolu]traiter un fichier xml simple en bash
Tu n'est pas obligé d'avoir un numéro.
Prend par exemnple le titre (en prenant soin de supprimer les espaces) qui sera alors considéré comme $i, puis tu remplace, dans la boucle, titre et date par emplacement et créateur.
Edit : en y réflechissant, bien il doit y avoir moyen de faire plus simple avec awk.
Il est un peu trop tard pour que je m'y mette maintenant mais si tu n'est pas pressé, je regarderai ca dans le we.
EDIT 2: Ya pas d'heure pour les braves
bon finalement c'est surement plus simple avec awk mais au dessus de mes compétences .
J'ai donc adapté la méthode précédente à ton fichier :
cat tmp | grep "<title>" | sed -e 's/<title>//g' -e 's/<\/title//g' -e 's/ //g' -e 's/ /_/g' -e 's/ : /:/g' -e 's/>//g' >titres
nb=1
for i in $(cat "titres") ; do
creator=$(cat tmp | grep "<creator>" | sed -e 's/<creator>//g' -e 's/<\/creator>//g' -e 's/ /_/g' | head -$nb | tail -1)
location=$(cat tmp | grep "<location>" | sed -e 's/<location>//g' -e 's/<\/location>//g' -e 's/ /_/g' | head -$nb | tail -1)
echo "$i $creator $location" >>liste
nb=$(( $nb + 1 ))
done
où tmp est ton fichier.
En espérant que ca te convienne
Sur ce, bonne nuit pour de vrai
Dernière modification par redisded (Le 12/07/2008, à 03:20)
Hors ligne
#8 Le 12/07/2008, à 09:41
- Totor
Re : [Résolu]traiter un fichier xml simple en bash
Voici ma contribution (ne nécessite pas de fichier temporaire ni de compteur pour accéder aux enregistrements) :
#!/bin/bash
fichierXML=./playlist.xml
while read track
do
title=`echo ${track}|sed 's/.*<title>\(.*\)<\/title>.*/\1/'`
creator=`echo ${track}|sed 's/.*<creator>\(.*\)<\/creator>.*/\1/'`
location=`echo ${track}|sed 's/.*<location>\(.*\)<\/location>.*/\1/'`
echo title=${title}
echo creator=${creator}
echo location=${location}
done < <(awk '/<title>/ {title=$0} /<creator>/ {creator=$0} /<location>/ {location=$0} /<\/track>/ { print title""creator""location}' ${fichierXML})
remplace les 3 lignes echo par ton traitement.
Postulat :la balise </track> est sur une ligne ne contenant pas d'autres informations
Dernière modification par Totor (Le 12/07/2008, à 10:37)
-- Lucid Lynx --
Hors ligne
#9 Le 12/07/2008, à 10:48
- redisded
Re : [Résolu]traiter un fichier xml simple en bash
arf en effet ca fait déja moins bricolage
while read track
Que fait cette ligne au juste?
pour toutes les occurences de track, faire... ?
Hors ligne
#10 Le 12/07/2008, à 11:44
- ToMs
Re : [Résolu]traiter un fichier xml simple en bash
Dans la nuit j'ai réussi a faire un truc semblable mais carrément moins optimisé, je le met pour info
#Recuperation de l'artiste
while read creator; do
artiste[$i]="$creator"
#echo "artiste[$i] = ${artiste[$i]}"
i=$(($i+1))
done << EOF
`sed -n -r 's%<creator>(.*)<\/creator>%\1%p' $XML`
EOF
#Recuperation du titre
while read title; do
titre[$j]="$title"
#echo "titre[$j] = ${titre[$j]}"
j=$(($j+1))
done << EOF
`sed -n -r 's%<title>(.*)<\/title>%\1%p' $XML`
EOF
#Recuperation de l'emplacement
while read location; do
emplacement[$k]="$location"
#echo "emplacement[$k] = ${emplacement[$k]}"
k=$(($k+1))
done << EOF
`sed -n -r 's%<location>(.*)<\/location>%\1%p' $XML`
EOF
Merci a tous pour le coup de main
Dernière modification par ToMs (Le 12/07/2008, à 11:56)
On est toujours le newbie de quelqu'un ...
Hors ligne
#11 Le 12/07/2008, à 12:33
- Totor
Re : [Résolu]traiter un fichier xml simple en bash
Explications :
awk ' /<track>/ {creator="";location="";title=""} /<title>/ {title=$0} /<creator>/ {creator=$0} /<location>/ {location=$0} /<\/track>/ { print title""creator""location}' ${fichierXML}
Cette ligne utilise awk pour créer un flux où chaque ligne contient toutes les informations d'une piste. c'est à dire les balises <title>, <creator> et <location>.
Note : j'ai rajouté /<track>/ {creator="";location="";title=""} pour réinitialiser les variables title, location et creator car il se peut qu'il manque l'une de ces informations dans une section <track>...</track> (on ne sait jamais !)
le
while read track
do
...
done < <(awk ...)
permet de ligne chacune des lignes du flux renvoyé par la commande awk. Chaque ligne lue dans le flux est placée dans la variable track.
Il ne reste plus qu'à récupérer le titre, l'auteur et l'emplacement depuis la variable track. Ceci est réalisé grâce à la commande sed.
Voilà !
-- Lucid Lynx --
Hors ligne
#12 Le 12/07/2008, à 12:47
- redisded
Re : [Résolu]traiter un fichier xml simple en bash
Merci à toi pour le cours, chapeau pour ta maitrise et tes explications claire
EDIT : Merci à toi pour les cours d'ailleurs, parce que c'est pas la premiere fois
Dernière modification par redisded (Le 12/07/2008, à 12:49)
Hors ligne