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 :

Découpage fichier XML


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 55
    Points : 42
    Points
    42
    Par défaut Découpage fichier XML
    Bonjour,

    Je post ici car j'ai un problème pour "découper" un fichier xml.

    Voici le fichier xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Message xmlns="http://www.test.com/">    <Identification>        <TypeMessage>TEST</TypeMessage>        <Version>1.0</Version>    </Identification>    <Begin>        <Content>            <PleinDeBalises>ICI</PleinDeBalises>               </Content>    </Begin></Message>
    Je n'ai pas identé volontairement car le fichier xml est bel et bien sur une seule et unique ligne.

    Je souhaiterais découper le fichier pour garder uniquement ce qu'il y a entre les balises "Begin", c'est à dire obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Content>            <PleinDeBalises>ICI</PleinDeBalises>               </Content>
    J'ai pas mal recherché sur internet du coté de sed, awk, csplit...etc mais j'avoue être un peu en galere Ce que j'ai trouvé de plus proche de mon problème est ce lien : "http://doc.ubuntu-fr.org/sed" mais je voudrais rechercher de maniere très précise avec "<Begin>" et "</Begin>".

    Est ce que quelqu'un pourrais me donner une piste à suivre? Ou mieux la bonne commande?

    Merci d'avance.

  2. #2
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Au choix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ cat plop 
    <Message xmlns="http://www.test.com/"> <Identification> <TypeMessage>TEST</TypeMessage> <Version>1.0</Version> </Identification> <Begin> <Content> <PleinDeBalises>ICI</PleinDeBalises> </Content> </Begin></Message>
     
    $ sed 's#.*<Begin> \(.*\) </Begin>.*#\1#' plop 
    <Content> <PleinDeBalises>ICI</PleinDeBalises> </Content>
     
    $ grep -Po '.*<Begin> \K.*(?=</Begin>)' plop 
    <Content> <PleinDeBalises>ICI</PleinDeBalises> </Content>
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 540
    Points : 19 361
    Points
    19 361
    Par défaut
    Bonjour,

    le format des fichiers XML pouvant varier, je prône pour leur traitement l'emploi d'outils ad'hoc : xsltproc, xmlstarlet...,
    la lecture des tutoriels, et l'usage du forum dédié.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Bonjour,

    Je suis d'accord avec N_BaH, mais pour le fun voici une version awk et une autre version sed:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ awk -F"</?Begin>" '{print $2}' plop
            <Content>            <PleinDeBalises>ICI</PleinDeBalises>               </Content>
    $ sed 's#.*<\(Begin>\)\(.*\)</\1.*#\2#' plop
            <Content>            <PleinDeBalises>ICI</PleinDeBalises>               </Content>
    Bonne Année 2015
    Cordialement.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Merci pour votre aide.

    Zipe 31 :

    La commande avec grep ne fonctionne pas avec mon environnement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -Po '.*<Begin> \K.*(?=</Begin>)' plop
    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    grep: illegal option -- P
    grep: illegal option -- o
    Usage: grep -hblcnsviw pattern file . . .
    La commande avec sed fonctionne uniquement si j'utilise le code dans ton message (avec un seul espace entre les balises) mais pas avec le code original (plusieurs espaces entre les balises).

    disedorgue :

    La commande awk :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F"</?Begin>" '{print $2}' plop
    Me retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Message xmlns="http://www.test.com/">
    Idem que Zipe31 : La commande avec sed fonctionne uniquement si j'utilise le code dans ton message (avec un seul espace entre les balises) mais pas avec le code original (plusieurs espaces entre les balises).

    Merci d'avance pour votre aide et bonne année 2015

  6. #6
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par Foyus Voir le message
    La commande avec grep ne fonctionne pas avec mon environnement
    Tu n'utilises alors probablement ni Linux, ni les outils GNU et tu n'es donc probablement pas dans le bon forum: http://www.developpez.net/forums/f17...mmandes-posix/
    ɹǝsn *sıɹɐlos*

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Pardon je me suis mal exprimé. Je voulais dire la commande grep ne fonctionne par sur mon environnement avec ces parametres. Sinon oui grep fonctionne Exemple :

    Me retourne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Message xmlns="http://www.test.com/">    <Identification>        <TypeMessage>TEST</TypeMessage>        <Version>1.0</Version>    </Identification>    <Begin>        <Content>            <PleinDeBalises>ICI</PleinDeBalises>               </Content>    </Begin></Message>

  8. #8
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par Foyus Voir le message
    Je voulais dire la commande grep ne fonctionne par sur mon environnement avec ces parametres.
    Tu ne t'es pas mal exprimé. J'avais bien compris ce que tu voulais dire et c'est bien ce qui me fait toujours penser que tu n'utilises pas GNU grep et que tu es dans le mauvais forum.

    Les options "-P" et "-o" sont des extensions de GNU grep.
    ɹǝsn *sıɹɐlos*

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    Par défaut
    D'après l'erreur retournée par grep, je pencherais pour du solaris.

    Pour mieux comprendre le problème coté sed, le but est-il de supprimer tous les espaces de début et de fin qui se trouve dans ta balise, si oui, le correctif suivant devrait le faire (pas testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sed 's#.*<\(Begin>\) *\(\([^ ]* *[^ ]*\)*\) *</\1.*#\2#' plop
    Cordialement.

  10. #10
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 848
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 848
    Points : 6 535
    Points
    6 535
    Par défaut
    Si les balises Begin sont uniques, tu peux retirer les parties du code xml qui ne t'intéresses pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's#.*<Begin> *\| *</Begin>.*##2;' file.xml
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 540
    Points : 19 361
    Points
    19 361
    Par défaut
    Ouf, j'y suis enfin parvenu à coup de XSLT, alors que je m'en sers moins d'une fois par an.

    OK, c'est un peu long, et le fichier xsl fait bien plus de lignes que vos one-liner, mais le fichier xml peut être plat, indenté, ou de traviole, le résultat est identique !
    le plus difficile a été de trouver (je ne dis pas "comprendre" : j'ai éhontément pompé du code sur le net) comment se débarrasser du namespace qui apparaît à la racine.
    il a, au préalable, fallu trouver comment référencer une racine qui comporte un namespace, car son nom est son nom et le namespace.
    sans cela le code serait quatre fois moins grand.
    Code fichier.xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <Message xmlns="http://test.com">    <Identification>        <TypeMessage>TEST</TypeMessage>        <Version>1.0</Version>    </Identification>    <Begin>        <Content>            <PleinDeBalises>ICI</PleinDeBalises>               </Content>    </Begin></Message>
    Code fichier.xsl : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       xmlns:ns="http://test.com" exclude-result-prefixes="ns">
     
       <xsl:output omit-xml-declaration="yes" />
     
       <xsl:template match="/ns:Message">
          <xsl:apply-templates select="ns:Begin"/>
       </xsl:template>
     
       <xsl:template match="ns:*">
          <xsl:element name="{local-name()}">
             <xsl:apply-templates select="node() | @*"/>
          </xsl:element>
       </xsl:template>
     
       <xsl:template match="node() | @*">
          <xsl:copy>
             <xsl:apply-templates select="node() | @*"/>
          </xsl:copy>
       </xsl:template>
     
    </xsl:stylesheet>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ xsltproc fichier.xsl fichier.xml
    <Begin>        <Content>            <PleinDeBalises>ICI</PleinDeBalises>               </Content>    </Begin>
    $ tidy -xml fichier.xml | xsltproc fichier.xsl -
    <Begin>        <Content>            <PleinDeBalises>ICI</PleinDeBalises>               </Content>    </Begin>



    «il est content, Gaëtan !»
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Cordialement.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Merci pour votre aide

    jlliagre : Ok alors autant pour moi Tu peux déplacer le sujet si tu le souhaites.

    CosmoKnacki & disedorgue : Les commandes sed ne retournent rien chez moi

    N_BaH : Merci beaucoup ca fonctionne parfaitement ! Je ne connaissais pas du tout xsltproc et je ne tombais pas du tout la dessus en recherchant sur internet. J'ai essayé de modifier un peu ton code pour mieux comprendre et je voudrais savoir si je veux rajouter une balise pour encadrer mon begin que faut-il rajouter dans le fichier.xsl?

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Message xmlns="http://test.com">    <Identification>        <TypeMessage>TEST</TypeMessage>        <Version>1.0</Version>    </Identification>    <NewBegin>    <Begin>        <Content>            <PleinDeBalises>ICI</PleinDeBalises>               </Content>    </Begin></NewBegin></Message>
    Merci d'avance

  14. #14
    Membre averti
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Points : 304
    Points
    304
    Par défaut
    Pourquoi ne pas utiliser la commande xpath ? xpath fichier.xml "/Message/Begin" ou xpath fichier.xml "/Message/Begin/*" (pour ne pas avoir le noeud "Begin" en root)

  15. #15
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 540
    Points : 19 361
    Points
    19 361
    Par défaut
    come je l'ai dit, il existe un forum dédié au XML/XSLT.
    je vous recommande d'y adresser vos questions à ce sujet.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Parfait merci pour votre aide

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Je viens de régler tout seul mon problème donc je l'ajoute au cas où ca intéresserait quelqu'un

    Il fallait ajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="ns:NewBegin">
    		  <xsl:apply-templates select="ns:Begin" />
       </xsl:template>

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

Discussions similaires

  1. Découpage du fichier XML en 3 niveaux
    Par dorra1987 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 08/01/2015, 10h50
  2. [SAX] Découpage fichier xml
    Par akhen3100 dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 06/03/2009, 10h59
  3. Lire un attribut dans un fichier XML en C++
    Par ti.k-nar dans le forum XML
    Réponses: 2
    Dernier message: 14/10/2002, 16h22
  4. [Kylix] Composant IBM pour fichiers XML
    Par Mister Nono dans le forum EDI
    Réponses: 1
    Dernier message: 29/09/2002, 21h28
  5. Balises HTML dans un fichier XML
    Par Bastet79 dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 04/09/2002, 16h29

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