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 :

Remplir un fichier xml à partir de plusieurs autres fichiers xml.


Sujet :

Modules Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 36
    Points : 25
    Points
    25
    Par défaut Remplir un fichier xml à partir de plusieurs autres fichiers xml.
    Bonsoir,

    Supposons que j'ai ces 3 fichiers mais ça peut aussi être 10 fichiers ...

    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
    <!-- fichier.xml -->
    <Test>
    	<Donnees>
    		<NumeroId>12455</NumeroId>
    		<Commmande>
    			<GroupeFichiers>
    				<NumeroGroupeInitial>1</NumeroGroupeInitial>
    				<Fichier>
    					<NomFichier1>image1.jpg</NomFichier1>
    					<NomFichier2>image2.jpg</NomFichier2>
    				</Fichier>
    			</GroupeFichiers>
    		</Commande>
    	</Donnees>
    </Test>
     
    <!-- fichier2.xml -->
    <Test>
    	<Donnees>
    		<NumeroId>12455</NumeroId>
    		<Commmande>
    			<GroupeFichiers>
    				<NumeroGroupeInitial>1</NumeroGroupeInitial>
    				<Fichier>
    					<NomFichier1>image3.jpg</NomFichier1>
    					<NomFichier2>image4.jpg</NomFichier2>
    				</Fichier>
    			</GroupeFichiers>
    		</Commande>
    	</Donnees>
    </Test>
     
    <!-- fichier3.xml -->
    <Test>
    	<Donnees>
    		<NumeroId>12456</NumeroId>
    		<Commmande>
    			<GroupeFichiers>
    				<NumeroGroupeInitial>1</NumeroGroupeInitial>
    				<Fichier>
    					<NomFichier1>image5.jpg</NomFichier1>
    					<NomFichier2>image6.jpg</NomFichier2>
    				</Fichier>
    			</GroupeFichiers>
    		</Commande>
    	</Donnees>
    </Test>
    Je souhaite remplir le fichier fichier.xml à partir de fichier2.xml et fichier3.xml de la façon suivante.
    Si le NumeroId de fichier2.xml = NumeroId de fichier.xml comme c'est le cas, alors le fichier fichier.xml deviendra le suivant :

    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
    <Test>
    	<Donnees>
    		<NumeroId>12455</NumeroId>
    		<Commmande>
    			<GroupeFichiers>
    				<NumeroGroupeInitial>1</NumeroGroupeInitial>
    				<Fichier>
    					<NomFichier1>image1.jpg</NomFichier1>
    					<NomFichier2>image2.jpg</NomFichier2>
    				</Fichier>
    				<Fichier>
    					<NomFichier1>image3.jpg</NomFichier1>
    					<NomFichier2>image4.jpg</NomFichier2>
    				</Fichier>
    			</GroupeFichiers>
    		</Commande>
    	</Donnees>
    </Test>
    C'est a dire qu'on ne prend que ce qui se trouve dans la balise <Fichier> et on insere le tout dans fichier.xml

    Si le NumeroId de fichier3.xml != NumeroId de fichier.xml comme c'est le cas, alors le fichier fichier.xml deviendra le suivant (en gardant ce qui avait été ajouté en parsant fichier2.xml) :
    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
    <Test>
    	<Donnees>
    		<NumeroId>12455</NumeroId>
    		<Commmande>
    			<GroupeFichiers>
    				<NumeroGroupeInitial>1</NumeroGroupeInitial>
    				<Fichier>
    					<NomFichier1>image1.jpg</NomFichier1>
    					<NomFichier2>image2.jpg</NomFichier2>
    				</Fichier>
    				<Fichier>
    					<NomFichier1>image3.jpg</NomFichier1>
    					<NomFichier2>image4.jpg</NomFichier2>
    				</Fichier>
    			</GroupeFichiers>
    		</Commande>
    	</Donnees>
    	<Donnees>
    		<NumeroId>12456</NumeroId>
    		<Commmande>
    			<GroupeFichiers>
    				<NumeroGroupeInitial>1</NumeroGroupeInitial>
    				<Fichier>
    					<NomFichier1>image5.jpg</NomFichier1>
    					<NomFichier2>image6.jpg</NomFichier2>
    				</Fichier>
    			</GroupeFichiers>
    		</Commande>
    	</Donnees>
    </Test>
    C'est a dire qu'on prend se qui se trouve dans la balise <Donnees> et on l'ajoute a la fin de la précedente.

    Mon souci est de savoir comment faire pour récupérer les blocs de données et de les insérées au bon endroit dans fichier.xml

    Merci

  2. #2
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Personnellement, je ferais ça avec XML::Twig. Si tu ne t'en es jamais servi, cela vaut le coup d'y consacrer un peu de temps, surtout si tu dois souvent faire des opérations de transformations sur des fichiers XML en Perl (et ce d'autant plus si ces fichiers volumineux).

    Je ne vais faire le code, c'est trop de boulot. Mais en gros,
    • tu construis 3 twigs sur tes trois fichiers,
    • avec un premier twig tu sélectionnes les nodes "donnees" avec NumeroId (que tu extrais) de fichier1.xml
    • pour chaque node obtenu,
      • avec le twig sur fichier2.xml, tu trouves si un node "donnees" a ce NumeroId (dans tous les cas tu sélectionnes tes nodes avec des XPath, c'est le plus simple) , si oui tu extrais le sous-node Fichier qui suit et le copie dans ton premier twig à l'emplacement voulu (tu es toujours positionné où il faut dans le parcours des nodes du premier fichier, tu n'as qu'à avancer jusqu'au NumeroGroupeInitial
      • tu replaces ton twig sur fichier2.xml en début (pour la boucle suivante)
      • tu procèdes de même avec le twig sur fichier3.xml (quitte à "rembobiner" le twig sur fichier.xml et à revenir où tu étais ensuite: j'ai pas bien compris si tu dois chercher dans tout fichier.xml que le NumeroId n'est pas présent)
    • tu écris ton twig dans fichier.xml


    Bon, j'espère que ça te donne des idées...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par iblis Voir le message
    Personnellement, je ferais ça avec XML::Twig. Si tu ne t'en es jamais servi, cela vaut le coup d'y consacrer un peu de temps, surtout si tu dois souvent faire des opérations de transformations sur des fichiers XML en Perl (et ce d'autant plus si ces fichiers volumineux).

    Je ne vais faire le code, c'est trop de boulot. Mais en gros,
    • tu construis 3 twigs sur tes trois fichiers,
    • avec un premier twig tu sélectionnes les nodes "donnees" avec NumeroId (que tu extrais) de fichier1.xml
    • pour chaque node obtenu,
      • avec le twig sur fichier2.xml, tu trouves si un node "donnees" a ce NumeroId (dans tous les cas tu sélectionnes tes nodes avec des XPath, c'est le plus simple) , si oui tu extrais le sous-node Fichier qui suit et le copie dans ton premier twig à l'emplacement voulu (tu es toujours positionné où il faut dans le parcours des nodes du premier fichier, tu n'as qu'à avancer jusqu'au NumeroGroupeInitial
      • tu replaces ton twig sur fichier2.xml en début (pour la boucle suivante)
      • tu procèdes de même avec le twig sur fichier3.xml (quitte à "rembobiner" le twig sur fichier.xml et à revenir où tu étais ensuite: j'ai pas bien compris si tu dois chercher dans tout fichier.xml que le NumeroId n'est pas présent)
    • tu écris ton twig dans fichier.xml


    Bon, j'espère que ça te donne des idées...
    Bonjour,

    Oui, je dois chercher dans tout le fichier fichier.xml si le numeroId n'est pas présent.
    J'ai commencé à faire ceci mais au moment ou je suis dans le cas numId = numId2, je ne sais pas comment faire pour récupérer mon bloc et l'ajouter a l'endroit qu'il 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
    27
    28
    29
    30
    31
    32
    33
    34
    #!/usr/bin/env perl -w
    use strict;
    use XML::Twig;
     
     
    my $twig= new XML::Twig;
    $twig->parsefile('fichier.xml');
    my $root= $twig->root;
    my @nodes = $root->get_xpath("Donnees");
     
    my @tab_numId;
    foreach my $node (@nodes)
    {
    	my $numeroId  = $node->first_child('NumeroId')->text;
    	print "numeroId = $numeroId\n";
     
    	my $twig2 = new XML::Twig;
    	$twig2->parsefile('fichier2.xml');
    	my $root2 = $twig2->root;
    	my @nodes2 = $root2->get_xpath("Donnees");
     
    	foreach my $node2(@nodes2)
    	{
    		my $numeroId2 = $node2->first_child('NumeroId')->text;
    		print "numeroId2 = $numeroId2\n";
    		if($numeroId == $numeroId2)
    		{
    			#on recupère le sous-node Fichier de fichier2.xml
    			my $tmp = $node2->get_xpath("Fichier");
     
    			next;
    		}
    	}
    }

  4. #4
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Ok, je vois où tu bloques.

    Je t'ai fais le code pour traiter fichier2.xml. A toi d'y ajouter le traitement pour fichier3.xml.
    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
    #!/usr/bin/env perl -w
    use strict;
    use XML::Twig;
     
    my $twig1 = XML::Twig->new (
    	pretty_print => 'indented'
    );
    my $twig2 = XML::Twig->new;
     
    $twig1->parsefile('file1.xml');
    my $root1= $twig1->root;
    $twig2->parsefile('file2.xml');
    my $root2= $twig2->root;
     
    my @nodes1 = $root1->get_xpath('//NumeroId');
     
    for my $node1 (@nodes1) {
    	my @nodes2 = $root2->get_xpath('//NumeroId');
    	for my $node2 (@nodes2) {
    		if ($node1->text eq $node2->text) {
    			my $file_node_1 = ($node1->get_xpath('//Fichier'))[0];
    			my $elem = ($node2->get_xpath('//Fichier'))[0]->copy;
    			$elem->paste( last_child => $file_node_1->parent);
    		} 
    	}
    }
     
    $twig1->print;
    J'ai testé bien sûr et ça fait ce que tu demandes. La fonction clé est copy-and-paste (très pratique, comme tu peux le voir).

  5. #5
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par iblis Voir le message
    Ok, je vois où tu bloques.

    Je t'ai fais le code pour traiter fichier2.xml. A toi d'y ajouter le traitement pour fichier3.xml.
    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
    #!/usr/bin/env perl -w
    use strict;
    use XML::Twig;
     
    my $twig1 = XML::Twig->new (
    	pretty_print => 'indented'
    );
    my $twig2 = XML::Twig->new;
     
    $twig1->parsefile('file1.xml');
    my $root1= $twig1->root;
    $twig2->parsefile('file2.xml');
    my $root2= $twig2->root;
     
    my @nodes1 = $root1->get_xpath('//NumeroId');
     
    for my $node1 (@nodes1) {
    	my @nodes2 = $root2->get_xpath('//NumeroId');
    	for my $node2 (@nodes2) {
    		if ($node1->text eq $node2->text) {
    			my $file_node_1 = ($node1->get_xpath('//Fichier'))[0];
    			my $elem = ($node2->get_xpath('//Fichier'))[0]->copy;
    			$elem->paste( last_child => $file_node_1->parent);
    		} 
    	}
    }
     
    $twig1->print;
    J'ai testé bien sûr et ça fait ce que tu demandes. La fonction clé est copy-and-paste (très pratique, comme tu peux le voir).
    Merci beaucoup

  6. #6
    Membre du Club
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Points : 48
    Points
    48
    Par défaut
    salut,

    J ai un probleme du meme genre mais avec 3 fichiers xml différents dans leurs structrues. 2 comme etant input et un output.

    j ai ecrit la structure du l output.xml mais il est encore vide.

    mon probleme c est:
    1-comment lire le contenu d un tag d un des 2 fichiers et l inserer dans le output.xml.
    2-comment lire les 2 fichiers input.xml a partir du command line et puis travailler avec ca au lens du prog

    je suis DEBUTANT et je serais tres reconnaissant d avoir quelqu un qui me donne un coups de pousse

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/04/2013, 13h09
  2. [Débutant] Exécution d'un fichier MATLAB à partir d'un autre fichier
    Par abdouccu dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/06/2012, 20h42
  3. [WD-2003] Modification sur fichier source => Modif sur plusieurs autres fichiers
    Par Nitromard dans le forum VBA Word
    Réponses: 5
    Dernier message: 10/01/2012, 11h57
  4. [DOM] Reconstruire un fichier XML à partir d'un autre fichier XML
    Par Jonvols dans le forum Format d'échange (XML, JSON...)
    Réponses: 12
    Dernier message: 13/11/2010, 01h49
  5. [FPDF] Créer un fichier PDF à partir d'un autre fichier PDF
    Par axel-erator dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 18/06/2006, 23h29

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