IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Récupérer une valeur entre deux balises dans un fichier XML


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 20
    Points
    20
    Par défaut Récupérer une valeur entre deux balises dans un fichier XML
    Bonjour,

    J'au fichier XML qui est généré, je dois écrire un script shell qui doit faire aller récupérer ce fichier, le renommer et le déplacer sur un serveur SFTP.
    Je bloque sur comment récupérer le non du fichier qui est situé entre deux balises <IdFichier></IdFichier>
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <Technique><DateEnvoi>2018-03-29</DateEnvoi> <IdFichier>ITTS.00002.20180329.001</IdFichier> </Technique>

    J'ai fait quelques recherches et j'ai essayé cette commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n 's,.*<IdFichier>\(.*\)</IdFichier>,\1,p' XMLFile.xml
    mais elle me retourne
    ITTS.00002.20180329.001</IdFichier> </Technique>......................................................
    je veux juste récupérer ITTS.00002.20180329.001 et renommer mon fichier avec ce contenu.

    Merci d'avance

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Utilise un outil spécifique aux fichiers xml, comme xmllint.

    Si ton sed ne marche pas, c'est probablement car l'étoile est gourmande. Cela veut dire qu'il y a un autre </IdFichier> sur la ligne, plus loin. L'étoile prend le maximum en compte.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    Merci pour votre réponse, mais c'est bien ça le problème IdFichier n'existe qu'une seule fois et pourtant il me ramène plusieurs balises derrière!

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    tu fais une substitution, il faut donc considérer la ligne entière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed -n 's,^.*<IdFichier>\(.*\)</IdFichier>.*$,\1,p'
    ITTS.00002.20180329.001
    une autre manière avec grep directement (et en admettant que la totalité des données à extraire soit bien sur la même ligne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -Po "<IdFichier>\K(.+?)(?=</IdFichier>)"
    • \K permet de virer tout ce qu'il y a avant
    • (?=...) permet de ne pas prendre en compte ce qui arrive après


    mais LA seule vraie solution propre c'est comme l'a suggéré Flodelarab d'utiliser un tool dont c'est le boulot comme xmllint ou xmlstarlet, traiter du XML à coups de sed, awk, grep etc. c'est considéré comme très cracra option hérétique, t'es prévenu...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    Merci BufferBob, le sed ça fonctionne ainsi par contre en ligne de commande ça marche parfaitement bien mais dans mon script non:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    # Check if there are XML files to handle
     
    count=0
     
    for filename in $XML/*.xml; do
     
            if [ -e $filename ]; then
     
                    # xml file found
     
                    count=$((count+1))
     
     
     
                    # move xml to MD.xml (as defined in request NQH)
     
     
     
                    #var= $(sed -n 's,.*<IdFichier>\(.\)</IdFichier>,\1,p' $filename)
     
                    var= $(sed -n 's,^.*<IdFichier>\(.*\)</IdFichier>.*$,\1,p' $filename)
     
                    echo "Nom du fichier: "$var
     
                    cp $filename $FILE/TS/$var.xml
     
                    echo "\n"                                                         >>$LOGF
     
                    echo "HANDLING XML FILE: "$filename                               >>$LOGF
     
                    echo "\n"                                                         >>$LOGF
     
                    echo "Nom du fichier: "$Var                                      >>$LOGF
     
     
     
                    EXIT_STATE=0
     
                    MAX_EXIT_STATE=0
     
     
     
     
     
            else
     
                    # no xml files
     
                    echo "\n"                                                                >>$LOGF
     
                    echo "*****************************************************************" >>$LOGF
     
                    echo "*              NO XML FILE TO HANDLE, EXIT PROGRAM              *" >>$LOGF
     
                    echo "*****************************************************************" >>$LOGF
     
                    echo "\n"                                                                >>$LOGF
     
                    MAX_EXIT_STATE=0
     
            fi
     
    done
    ça retoune :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Prestations.sh[63]: ITTS.00002.20180329.001: not found [Aucun fichier ou dossier de ce type]
     
    Nom du fichier:

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 743
    Points
    12 743
    Par défaut
    Bonjour,

    C'est normal, tu fais une erreur courante:
    Pas ok:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var= $(sed -n 's,^.*<IdFichier>\(.*\)</IdFichier>.*$,\1,p' $filename)
    ok:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var=$(sed -n 's,^.*<IdFichier>\(.*\)</IdFichier>.*$,\1,p' $filename)
    Je te laisse trouver la différence entre les 2 lignes ( il n'y a pas de piège )
    Cordialement.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    Merci Merci Merci!!!!

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/05/2014, 12h38
  2. Rechercher valeur entre 2 balises dans un fichier XML
    Par sachadee dans le forum FAQs Windows
    Réponses: 0
    Dernier message: 08/02/2013, 02h13
  3. Insérer une ligne entre deux autres dans un fichier
    Par c1malabar dans le forum Langage
    Réponses: 8
    Dernier message: 25/05/2011, 19h44
  4. [RegEx] Récupérer une valeur entre deux chaines
    Par thebarbarius dans le forum Langage
    Réponses: 7
    Dernier message: 04/04/2010, 16h47
  5. Réponses: 6
    Dernier message: 17/02/2010, 19h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo