Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 roll

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 wink

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 wink

bon finalement c'est surement plus simple avec awk mais au dessus de mes compétences roll .

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 wink

Sur ce, bonne nuit pour de vrai wink

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 wink

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 wink

EDIT : Merci à toi pour les cours d'ailleurs, parce que c'est pas la premiere fois wink

Dernière modification par redisded (Le 12/07/2008, à 12:49)

Hors ligne