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

Modules Perl Discussion :

Parsing xml pour retomber sur du xml


Sujet :

Modules Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Par défaut Parsing xml pour retomber sur du xml
    J'ai un fichier xml je dois via un script ouvrir, récupérer quelques infos de certaines balises et réécrire le même fichier en sortie en changeant juste 2 3 balises selon les informations que j'aurais récupéré. Comment parcourir mon xml pour récupérer le contenu de certaines balises et modifier en fin de compte le contenu de certaines balises de ce même fichier en entrée?

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Bonjour,

    Premièrement, merci de respecter la ponctuation lorsque vous écrivez, sinon, il est difficile de vous suivre.

    Pour analyser un fichier XML, le module XML::Twig est une valeur sûre. Néanmoins, pour vous aider, il serait intéressant d'avoir un exemple de fichier XML.

    Sinon, le principe est le suivant :

    • j'analyse mon fichier XML avec Twig ;
    • effectue les modifications en mémoire si la RAM le permet ;
    • génère un nouveau fichier (généralement temporaire) ;
    • puis renomme ce fichier en mon fichier original.


    Voilà !

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Par défaut
    Voilà un exemple de fichier :

    Code xml : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <PFP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PFPV2_1.xsd">
        <version>2</version>
        <compte>courant</compte>
        <mouvement>aucun</mouvement>
        <emetteur>banque</emetteur>
        <destinataire>client</client>
        <domiciliation>
            <nom>Banque Populaire</nom>
            <adresse>4 rue du bucheron, Cannes</adresse>
            <ouverture>8H30 à 12H et 14H à 17H30</ouverture>
        </domiciliation>
        <virement>
            <automatique>SFR</automatique>
            <jour_prelevement>le 05 du mois</jour_prelevement>
        </virement>
    </PFP>

    Citation Envoyé par djibril Voir le message
    Bonjour,

    Premièrement, merci de respecter la ponctuation lorsque vous écrivez, sinon, il est difficile de vous suivre.

    Pour analyser un fichier XML, le module XML::Twig est une valeur sûre. Néanmoins, pour vous aider, il serait intéressant d'avoir un exemple de fichier XML.

    Sinon, le principe est le suivant :

    • j'analyse mon fichier XML avec Twig ;
    • effectue les modifications en mémoire si la RAM le permet ;
    • génère un nouveau fichier (généralement temporaire) ;
    • puis renomme ce fichier en mon fichier original.


    Voilà !

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Par défaut
    Lorsque le fichier xml est parsé,

    si le nom de la banque est la banque populaire alors on change la donnée dans la balise "émetteur". Si le virement automatique est égal à SFR, on change le destinataire en mettant "client SFR" au lieu de "client". Le reste du fichier reste inchangé. Au final nous aurons un fichier comme suit :


    Code xml : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <PFP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PFPV2_1.xsd">
        <version>2</version>
        <compte>courant</compte>
        <mouvement>aucun</mouvement>
        <emetteur>Banque Populaire</emetteur>
        <destinataire>client SFR</client>
        <domiciliation>
            <nom>Banque Populaire</nom>
            <adresse>4 rue du bucheron, Cannes</adresse>
            <ouverture>8H30 à 12H et 14H à 17H30</ouverture>
        </domiciliation>
        <virement>
            <automatique>SFR</automatique>
            <jour_prelevement>le 05 du mois</jour_prelevement>
        </virement>
    </PFP>
    Le fichier final devra avoir comme extension ".modifié"


    Citation Envoyé par djibril Voir le message
    Bonjour,

    Premièrement, merci de respecter la ponctuation lorsque vous écrivez, sinon, il est difficile de vous suivre.

    Pour analyser un fichier XML, le module XML::Twig est une valeur sûre. Néanmoins, pour vous aider, il serait intéressant d'avoir un exemple de fichier XML.

    Sinon, le principe est le suivant :

    • j'analyse mon fichier XML avec Twig ;
    • effectue les modifications en mémoire si la RAM le permet ;
    • génère un nouveau fichier (généralement temporaire) ;
    • puis renomme ce fichier en mon fichier original.


    Voilà !

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Par défaut
    Bonjour, Djibril.
    J'ai à peu près compris comment fonctionnait l'XML Twig et il y'a quelque chose qui m'embête un peu. Dans le script "ParseurXMLTwigDom.pl" , vous réécrivez votre fichier texte en parcourant le fichier xml ligne par ligne. Dans le script "Twig xml A la twig intelligent", vous charger le stricte nécessaire. Ce que j'aimerais c'est écrire dans mon fichier de sortie les balises que j'ai chargé et traité mais aussi les autres balises qui n'ont pas été modifiées. Je cherche à éviter de faire un print de chaque balise qui n'a pas été chargé. Quelqu'un aurait une idée?

    Citation Envoyé par djibril Voir le message
    Bonjour,

    Premièrement, merci de respecter la ponctuation lorsque vous écrivez, sinon, il est difficile de vous suivre.

    Pour analyser un fichier XML, le module XML::Twig est une valeur sûre. Néanmoins, pour vous aider, il serait intéressant d'avoir un exemple de fichier XML.

    Sinon, le principe est le suivant :

    • j'analyse mon fichier XML avec Twig ;
    • effectue les modifications en mémoire si la RAM le permet ;
    • génère un nouveau fichier (généralement temporaire) ;
    • puis renomme ce fichier en mon fichier original.


    Voilà !

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    C'est très simple à effectuer. Voici un exemple de programme qui change toutes les balises compte de ton XML et le fichier final est un fichier avec l'extension .modifie

    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
    #!/usr/bin/perl
    use Carp;
    use strict;
    use warnings;
    use XML::Twig;
     
    my $twig = XML::Twig->new(
      pretty_print => 'indented',
      Twig_handlers => {
        'compte' => \&modifier_comptes,
      },
    );
    $twig->parsefile( 'TOTO.xml'); 
    open my $fh, '>', 'TOTO.modifie';
    $twig->print($fh);
    close $fh;
     
    sub modifier_comptes {
      my ( $twig, $twig_compte ) = @_;
     
      my $nom_compte = $twig_compte->text;
      # Modification
      $twig_compte->set_text( $nom_compte . ' -modifie' );
      $twig_compte->set_att( login => 'flas21' );
      return;
    }
    Fichier TOTO.xml
    Code xml : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <PFP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PFPV2_1.xsd">
        <version>2</version>
        <compte>courant</compte>
        <mouvement>aucun</mouvement>
        <emetteur>banque</emetteur>
        <destinataire>client</destinataire>
        <domiciliation>
            <nom>Banque Populaire</nom>
            <adresse>4 rue du bucheron, Cannes</adresse>
            <ouverture>8H30 à 12H et 14H à 17H30</ouverture>
        </domiciliation>
        <virement>
            <automatique>SFR</automatique>
            <jour_prelevement>le 05 du mois</jour_prelevement>
        </virement>
    </PFP>

    Fichier TOTO.modifie
    Code xml : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <PFP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PFPV2_1.xsd">
      <version>2</version>
      <compte login="flas21">courant -modifie</compte>
      <mouvement>aucun</mouvement>
      <emetteur>banque</emetteur>
      <destinataire>client</destinataire>
      <domiciliation>
        <nom>Banque Populaire</nom>
        <adresse>4 rue du bucheron, Cannes</adresse>
        <ouverture>8H30 à 12H et 14H à 17H30</ouverture>
      </domiciliation>
      <virement>
        <automatique>SFR</automatique>
        <jour_prelevement>le 05 du mois</jour_prelevement>
      </virement>
    </PFP>

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Par défaut
    Cet exemple de code fonctionne bien, merci pour l'aide apportée. Cependant j'ai encore un petit problème. Disons que ce que je veux modifier se trouve dans la balise "nom" qui se trouve dans la balise "domiciliation". En adaptant votre script un peu, tout le contenu de la balise domiciliation est effacé. Je me retrouve du coup avec : <domiciliation>valeur modifiée</domiciliation>. Je perds les balises à l'intérieur de domiciliation. Je ne comprends pas ce qui cloche, pourtant je ne modifie que la balise nom.

    Citation Envoyé par djibril Voir le message
    C'est très simple à effectuer. Voici un exemple de programme qui change toutes les balises compte de ton XML et le fichier final est un fichier avec l'extension .modifie

    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
    #!/usr/bin/perl
    use Carp;
    use strict;
    use warnings;
    use XML::Twig;
     
    my $twig = XML::Twig->new(
      pretty_print => 'indented',
      Twig_handlers => {
        'compte' => \&modifier_comptes,
      },
    );
    $twig->parsefile( 'TOTO.xml'); 
    open my $fh, '>', 'TOTO.modifie';
    $twig->print($fh);
    close $fh;
     
    sub modifier_comptes {
      my ( $twig, $twig_compte ) = @_;
     
      my $nom_compte = $twig_compte->text;
      # Modification
      $twig_compte->set_text( $nom_compte . ' -modifie' );
      $twig_compte->set_att( login => 'flas21' );
      return;
    }
    Fichier TOTO.xml
    Code xml : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <PFP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PFPV2_1.xsd">
        <version>2</version>
        <compte>courant</compte>
        <mouvement>aucun</mouvement>
        <emetteur>banque</emetteur>
        <destinataire>client</destinataire>
        <domiciliation>
            <nom>Banque Populaire</nom>
            <adresse>4 rue du bucheron, Cannes</adresse>
            <ouverture>8H30 à 12H et 14H à 17H30</ouverture>
        </domiciliation>
        <virement>
            <automatique>SFR</automatique>
            <jour_prelevement>le 05 du mois</jour_prelevement>
        </virement>
    </PFP>

    Fichier TOTO.modifie
    Code xml : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <PFP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PFPV2_1.xsd">
      <version>2</version>
      <compte login="flas21">courant -modifie</compte>
      <mouvement>aucun</mouvement>
      <emetteur>banque</emetteur>
      <destinataire>client</destinataire>
      <domiciliation>
        <nom>Banque Populaire</nom>
        <adresse>4 rue du bucheron, Cannes</adresse>
        <ouverture>8H30 à 12H et 14H à 17H30</ouverture>
      </domiciliation>
      <virement>
        <automatique>SFR</automatique>
        <jour_prelevement>le 05 du mois</jour_prelevement>
      </virement>
    </PFP>

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Montre ton programme.

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Par défaut
    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
    #!/usr/bin/perl
    use Carp;
    use strict;
    use warnings;
    use XML::Twig;
     
    my $twig = XML::Twig->new(
      pretty_print => 'indented',
      Twig_handlers => {
        'domiciliation' => \&modifier_comptes,
      },
    );
    $twig->parsefile( 'TOTO.xml'); 
    open my $fh, '>', 'TOTO.modifie';
    $twig->print($fh);
    close $fh;
     
    sub modifier_comptes {
      my ( $twig, $twig_compte ) = @_;
     
      my $nom_compte = $twig_compte->field('nom');
      # Modification
      $twig_compte->set_text( $nom_compte . ' -modifie' );
      $twig_compte->set_att( login => 'flas21' );
      return;
    }


    Citation Envoyé par djibril Voir le message
    Montre ton programme.

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Je t'ai demandé le code que tu as toi réalisé et non le mien

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Citation Envoyé par flash21 Voir le message
    En adaptant votre script un peu, tout le contenu de la balise domiciliation est effacé. Je me retrouve du coup avec : <domiciliation>valeur modifiée</domiciliation>.
    Qu'as-tu fais pour avoir ça ?

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Par défaut
    Le script que j'ai envoyé hier soir n'est pas exactement le même que celui que tu m'avais envoyé. Il y'a une différence vers la fin. C'est celui là qui donne le résultat dont tu demandes l'origine.


    Citation Envoyé par djibril Voir le message
    Qu'as-tu fais pour avoir ça ?

  13. #13
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Ok, je n'avais pas fait gaffe.
    1) Lorsque tu réponds à un message, clique sur le bouton et non sur qui ne doit être utilisé qu'en cas de réel besoin. Car à force, ça alourdit les message inutilement.
    Merci

    2) Pour revenir à ton souci, ton problème provient de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Twig_handlers => {
        'domiciliation' => \&modifier_comptes,
      },
    Tu demandes à twig d'appeler la procédure sur la balise domiciliation. Ainsi, lorsque que twig lit cette balise, il effectue le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      my $nom_compte = $twig_compte->field('nom');
      # Modification
      $twig_compte->set_text( $nom_compte . ' -modifie' );
      $twig_compte->set_att( login => 'flas21' );
    Donc, le contenu de la balise est modifié via set_text, d'où la suppression de tout ce qu'il y avait dedans. Grâce à set_att, un nouvel attribut est rajouté.

    Si tu veux modifier le contenu de la balise nom, écrit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Twig_handlers => {
        'nom' => \&modifier_comptes,
      },
    ainsi toutes les balises nom seront modifiées. Si tu ne souhaites modifier que les balises nom contenu dans les balises domiciliation, tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Twig_handlers => {
        'domiciliation/nom' => \&modifier_comptes,
      },

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

Discussions similaires

  1. Parser un XML pour obtenir un autre XML
    Par hedibox dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 13/09/2013, 15h04
  2. representation des donnée en xml pour android sur serveur
    Par kalfadine dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 14/04/2012, 17h19
  3. Réponses: 4
    Dernier message: 27/02/2010, 22h04
  4. [c#][xml] requete xpath sur document xml avec espace de noms
    Par fab56 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/02/2009, 11h56
  5. [XML] Recherche Banque de fichiers XML pour tester
    Par MoTUmBo dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 14/10/2006, 11h08

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