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 :

Modification d'un fichier XML à l'aide d'un script shell


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 9
    Par défaut Modification d'un fichier XML à l'aide d'un script shell
    Salut,
    J'ai un fichier XML qui ressemble à ça:

    <balise1>
    <balise2>
    <balise4>
    <nom>toto1<\nom>
    </balise4>
    </balise2>
    <balise3>
    <balise4>
    <nom>toto2<\nom>
    </balise4>
    </balise3>
    </balise1>

    Mon problème est que il faut que je puisse modifier le contenu de la balise <nom> dans le bloc de la <balise2>
    Je suis obligé de le faire dans un script shell.
    Merci d'avance

  2. #2
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 9
    Par défaut
    Merci de ta réponse.
    Le problème est que je ne peux pas télécharger de module ou autre sur cet environnement

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 9
    Par défaut
    J'ai également un début de solution mais c'est assez galère.
    Dans un premier temps, j'extrait le bloc que je veux modifier grâce à une commande sed. Puis ensuite, je modifie la valeur du bloc <name> puis je réinsère mon nouveau bloc dans le fichier d'origine.
    Toutefois, j'ai un problème au niveau de l'extraction. En effet, lorsque j'effectue ma commande sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat xml_file | sed -n "/<balise2>/,/<\/balise2>/p" | sed -n "/<balise4>/,/<\/balise4>/p"
    Celle ci marche lorsque je la tape en ligne de commande mais elle ne marche plus lorsque je la met dans le script shell. Il me met 'extra characters after command'.
    Si vous avez une solution à ce pb je suis preneur

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 375
    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 375
    Par défaut
    Tu dois avoir une fin de ligne à la dos au lieu d'unix...

    Sinon, en un seul sed, changement ici dans l'exemple de toto1 en titi2 selon ton besoin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ cat /tmp/xxxml
    <balise1>
            <balise2>
                    <balise4>
                            <nom>toto1<\nom>
                    </balise4>
            </balise2>
            <balise3>
                    <balise4>
                            <nom>toto2<\nom>
                    </balise4>
            </balise3>
    </balise1>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ sed -n '/<balise2>/,/<\/balise2>/{N;s/\(<nom>\)[^<]*\(<\\nom>\)/\1titi1\2/};p' /tmp/xxxml
    <balise1>
            <balise2>
                    <balise4>
                            <nom>titi1<\nom>
                    </balise4>
            </balise2>
            <balise3>
                    <balise4>
                            <nom>toto2<\nom>
                    </balise4>
            </balise3>
    </balise1>

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 9
    Par défaut
    Merci disedorgue de ton aide ! Ta commande marche ! (Il y a juste une petite coquille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sed -n '/<balise2>/,/<\/balise2>/{N;s/\(<nom>\)[^<]*\(<\/nom>\)/\1titi1\2/};p' /tmp/xxxml
    )
    Toutefois, j'aimerais comprendre le fonctionnement de ce que tu as mis dans l'accolade. En effet, j'aimerais le généraliser car j'ai un cas où ce schéma est répété à un niveau de profondeur supplémentaire (Ouais je travail sur un fichier xml vraiment compliqué haha)

    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
    $ 
    <balise1>
            <balise2>
                    <balise4>
                            <nom>titi1<\nom>
                            <prenoms>
                                            <prenom>Jean<\prenom>
                            <\prenoms>
                    </balise4>
            </balise2>
            <balise3>
                    <balise4>
                            <nom>toto2<\nom>
                            <prenoms>
                                            <prenom>Pierre<\prenom>
                            <\prenoms>
                    </balise4>
            </balise3>
    </balise1>
    Je veux juste modifier le prénom Jean en Michel dans la balise numéro 2
    Merci d'avance

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 375
    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 375
    Par défaut
    Il y a bien une coquille pour ma part, mais ce n'est pas celle que tu donnes car je l'ai mise selon le fichier d'origine à traiter

    D'ailleurs, le deuxième exemple de fichier à traiter ressemble un peu à rien...

    Pour changer aussi le prénom, il suffit que tu rajoutes dans l'accolade s/\(<prenom>\)[^<]*\(<\/prenom>\)/\1Michel\2/ et retirer la coquille qui est le N, ici il ne sert à rien.
    Donc, ça devient en simplifiant au max:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed  '/<balise2>/,/<\/balise2>/{s/\(<nom>\)[^<]*\(<\/nom>\)/\1titi1\2/;s/\(<prenom>\)[^<]*\(<\/prenom>\)/\1Michel\2/;}'
    Ensuite, je n'ai pas très bien compris le niveau de difficulté que possède ton fichier et ton but final sur celui-ci ?

    En explication, ce qui est entre accolades n'est exécuté que si on est dans la balise2.

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 9
    Par défaut
    Merci de ta réponse,

    En fait mon problème est que je veux créer un script qui me permet de modifier le contenu de n'importe quelle balise d'un fichier xml. J'y arrive parfaitement avec les balises qui portent un nom unique. Mais j'ai un problème avec les balises qui ont le même noms. Comme dans cet exemple:

    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
    <balise1>
                   <baliseA>Valeur1A</baliseA>
                   <baliseB>Valeur1B</baliseB>
                   <baliseC>Valeur1C</baliseC>
                   <baliseD>
                                  <sousBaliseA>toto1</sousBaliseA>
                   </baliseD>
                   <baliseE>
                                  <sousBaliseA>toto2</sousBaliseA>
                                  <sousBaliseB>toto3</sousBaliseB>
                   </baliseE>
    </balise1>
    <balise2>
                   <baliseA>Valeur2A</baliseA>
                   <baliseB>Valeur2B</baliseB>
                   <baliseC>Valeur2C</baliseC>
                   <baliseD>
                                  <sousBaliseA>toto1</sousBaliseA>
                   </baliseD>
                   <baliseE>
                                  <sousBaliseA>toto2</sousBaliseA>
                                  <sousBaliseB>toto3</sousBaliseB>
                   </baliseE>
    </balise2>
    J'ai pas de problème pour modifier le contenu des balises A à C de la balise 2. Mais le problème viens pour la sous-balise A qui est présente dans la balise D et E de la balise 2.
    Merci d'avance

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 375
    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 375
    Par défaut
    sed n'est pas vraiment adapté pour ça, il vaudrait mieux que tu utilises un outil de parsing xml , mais si tu n'as pas trop le choix, un moyen de faire en sed:

    Si je reprend ton dernier exemple et si on désire changer par exemple la valeur de balise2=>baliseE=>sousBaliseA en titi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/<balise2>/,/<\/balise2>/{H;/<\/balise2>/{z;x;s/^\n//;s/\(<balise2>.*<baliseE>.*<sousBaliseA>\)[^<]*/\1titi/;p;};b;};p' fichier
    Ici:
    en bleu: l'ouverture de la balise de plus haut niveau que tu veux traiter.
    en vert: la fermeture de la balise de plus haut niveau que tu veux traiter (le pendant fermant du bleu).
    en rouge: la descente de la balise de plus haut niveau jusqu'à la balise que tu veux modifier.

    En explication brève: toute la partie du sed /<balise2>/,/<\/balise2>/{H;/<\/balise2>/{z;x;s/^\n//; ne sert qu'à charger dans le tampon de travail de sed le contenu complet de la balise de plus haut niveau sur laquelle on désire faire des modifications. Et comme celle-ci est entièrement dans le tampon, on peut considérer de travailler sur une seule ligne (même si les retour de ligne sont présent et qu'ils faut en tenir compte).

  10. #10
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 9
    Par défaut
    Merci encore de ta réponse.
    Je commmence à comprendre pourquoi sed n'est pas adapté à ce type de recherche haha . Malheureusement, je ne peux pas télécharger d'outils.
    Pour revenir à ta commande. Elle marche très bien. Toutefois, lorsque je veux changer la sous-balise A, de la balise D, de la balise 2, il me change toujours la dernière occurence de la sous-balise A de la balise 2. J'ai essayé de modifier ta commande. Mais je n'arrive toujours pas à trouver
    Merci d'avance

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 375
    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 375
    Par défaut
    En effet, j'étais sur un cas particulier, que j'ai trop simplifié, donc voici la complétude (en rouge) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/<balise2>/,/<\/balise2>/{H;/<\/balise2>/{z;x;s/^\n//;s/\(<balise2>.*<baliseD>.*<sousBaliseA>\)[^<]*\(.*<\/baliseD>\)/\1titi\2/;p;};b;};p' fichier
    ou plus complète (avec toutes les fermetures de balises) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/<balise2>/,/<\/balise2>/{H;/<\/balise2>/{z;x;s/^\n//;s/\(<balise2>.*<baliseD>.*<sousBaliseA>\)[^<]*\(<\/sousBaliseA>.*<\/baliseD>.*<\/balise2>\)/\1titi\2/;p;};b;};p' fichier

  12. #12
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 9
    Par défaut
    Merci beaucoup ! Ca marche !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. modification d'un fichier xml
    Par DanielW33 dans le forum ANT
    Réponses: 1
    Dernier message: 09/10/2006, 16h38
  2. [DOM XML] Modification d'un fichier XML en php
    Par aldo-tlse dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 07/07/2006, 18h28
  3. [xml/xsl/xhtml] modification d'un fichier XML
    Par florent_de_brest dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 25/05/2006, 20h43
  4. [c#] Modification d'un fichier XML
    Par topolino dans le forum Windows Forms
    Réponses: 13
    Dernier message: 21/03/2006, 14h51
  5. [DOM] Modification d'un fichier XML
    Par nana1 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 21/11/2005, 23h22

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