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

Langage Perl Discussion :

mettre un fichier xml dans un table de hachage perl


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 33
    Points : 17
    Points
    17
    Par défaut mettre un fichier xml dans un table de hachage perl
    Bonjour,

    j'ai besoin de votre aide
    Je veux extraire les données d'in fichier xml et les mettre dans une table de hachage(enfin ça devra être hash de hash ). Mon fichier comprend différentes balises.Je vais juste mettre les différents niveaux d'un extrait de mon huge 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
    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
     
    <ELEMENTS>
            <SENDER-RECEIVER-INTERFACE UUID="DCE:54eab7c0-e2d7-4822-b00a-485a82663000">
              <SHORT-NAME>IF_Eng_noCmprCyl</SHORT-NAME>
              <LONG-NAME>IF_Eng_noCmprCyl</LONG-NAME>
              <DATA-ELEMENTS>
                <DATA-ELEMENT-PROTOTYPE UUID="DCE:f95febd5-cdbd-4ba8-a18f-e5ea4d07287d">
                  <SHORT-NAME>Eng_noCmprCyl</SHORT-NAME>
                  <LONG-NAME>Eng_noCmprCyl</LONG-NAME>
                  <TYPE-TREF>/autosar_types/UInt8</TYPE-TREF>
                  <IS-QUEUED>false</IS-QUEUED>
                </DATA-ELEMENT-PROTOTYPE>
              </DATA-ELEMENTS>
              <MODE-GROUPS/>
            </SENDER-RECEIVER-INTERFACE>
     <ATOMIC-SOFTWARE-COMPONENT-TYPE UUID="DCE:25dffdb2-c1f5-480e-8c74-98567919c9dd">
              <SHORT-NAME>AdvCord</SHORT-NAME>
              <LONG-NAME>AdvCord</LONG-NAME>
              <PORTS>
                <R-PORT-PROTOTYPE UUID="DCE:85b8a73b-3246-45bb-bbcd-b0346d044717">
                  <SHORT-NAME>R_Eng_noCmprCyl</SHORT-NAME>
                  <LONG-NAME>R_Eng_noCmprCyl</LONG-NAME>
                  <ANNOTATIONS/>
                  <REQUIRED-INTERFACE-TREF>/AdvCord_Package/IF_Eng_noCmprCyl</REQUIRED-INTERFACE-TREF>
                </R-PORT-PROTOTYPE>
    <P-PORT-PROTOTYPE UUID="DCE:85b8a73b-3246-45bb-bbcd-b0346d044717">
                  <SHORT-NAME>R_Eng_noCmprCyl</SHORT-NAME>
                  <LONG-NAME>R_Eng_noCmprCyl</LONG-NAME>
                  <ANNOTATIONS/>
                  <REQUIRED-INTERFACE-TREF>/AdvCord_Package/IF_Eng_noCmprCyl</REQUIRED-INTERFACE-TREF>
                </P-PORT-PROTOTYPE>
             <\PORTS>
     <INTER-RUNNABLE-VARIABLE UUID="DCE:6758c46a-bf2f-45ff-8e14-886d8ce7b23f">
                  <SHORT-NAME>IgSys_prm_agIgTestCyl_6_irv</SHORT-NAME>
                  <LONG-NAME>IgSys_prm_agIgTestCyl_6_irv</LONG-NAME>
                  <TYPE-TREF>/autosar_types/UInt8</TYPE-TREF>
                  <COMMUNICATION-APPROACH>IMPLICIT</COMMUNICATION-APPROACH>
                </INTER-RUNNABLE-VARIABLE>
    <ARRAY-TYPE UUID="DCE:a6d66773-5acd-49e1-8bd9-1395d3ae0ede">
              <SHORT-NAME>rt_Array_UInt8_6</SHORT-NAME>
              <LONG-NAME>rt_Array_UInt8_6</LONG-NAME>
              <ELEMENT-TYPE-REF>/autosar_types/UInt8</ELEMENT-TYPE-REF>
              <MAX-NUMBER-OF-ELEMENTS>6</MAX-NUMBER-OF-ELEMENTS>
            </ARRAY-TYPE>
          </ELEMENTS>
    ce que je veux et d'avoir le contenu de mon fichier dans une table de hachage
    J'ai pu récupérer les premiers éléments de la balise "sender receiver interface"..mais les autres nn

  2. #2
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bonjour,

    Utilise le module XML::Simple, il le fera pour toi.
    Mais si ton but est d'analyser le fichier XML, je te recommande de lire mon article sur le sujet.

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Il y a plusieurs modules du CPAN qui font cela, dont XML::Hash
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 33
    Points : 17
    Points
    17
    Par défaut
    Merci pour votre réponses

    j'utilise xml twig puisque mon fichier est très gros en se référant a ceci :
    XML::Twig (recommandé)
    Il a été conçu par Michel Rodriguez. Il est stable, performant, simple d'utilisation et activement maintenu. Il fait partie des modules intelligents en ce sens que l'on peut faire du DOM en chargeant tout en mémoire, ou même parser uniquement des portions d'un fichier en ne chargeant en mémoire que ces dernières ! Il est également recommandé pour tous les fichiers XML, surtout les très gros ! Il comprend énormément de méthodes (une centaine !) permettant de jouer avec le fichier XML. Il peut également parser facilement des fichiers xhtml. Il est basé sur XML:arser, lui-même basé sur Expat. C'est un parseur non validant.
    En effet je veux mettre son contenu dans une table de hachage et d'accéder a ces données pour les générer en Code C.
    je vais voir donc le module XML:Hash

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 33
    Points : 17
    Points
    17
    Par défaut
    malheureusement je peux pas utiliser ce module car j'utilise XML:Twig et ce module demande les fonctionnalités de XML:SIMPLE

  6. #6
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Si tu utilises XML::Twig, ce qui est très bien, où est donc le souci ? Tu rempli ton hash comme bon te semble !

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Si tu utilises XML::Twig, tu peux simplement utiliser l'interface de ce module à la place d'un hash pour faire ton traitement... comme dit Djibrill.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 33
    Points : 17
    Points
    17
    Par défaut
    voila mon code
    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
    use warnings;
    use XML::Twig;
     
    #input
    my $file='AdvCord.arxml';
    #output
    my $FichierResulat = 'a.c';
    open( my $FhResultat, '>', $FichierResulat )
      or die("Impossible d'ouvrir le fichier $FichierResulat\n$!");
     
    #creation de parser
    my $twig=XML::Twig->new(
    						twig_roots=>{ELEMENTS=>1},
    						);
    $twig->parsefile($file);
     
    # grab the root 
    my $root=$twig->root;  	
    sub fct 
    {
    	my %hash;
    	foreach my $a($root->findnodes("//ELEMENTS/*"))
    	{    
    		#Extraction names of SENDER
    		$hash{sender} = $a->field('SHORT-NAME');
    		foreach my $TwigLangage( $a->children('DATA-ELEMENTS'))
    		{
    			foreach my $TwigModule( $TwigLangage->children('DATA-ELEMENT-PROTOTYPE') ) 
    			{
    				#Extraction names and types of DATA-ELEMENT-PROTOTYPE
    				$hash{sender}{Name}=$TwigModule->field('SHORT-NAME');
    				my $type =$TwigModule->field('TYPE-TREF');
    				$hash{sender}{type}=substr($type,15);
     
    			}
    		}
    		return($hash{sender}{Name},$hash{sender}{type});
    	}
     
    }
    my %h;
    ($h{sender}{Name},$h{sender}{type})=fct();
    print "$h{sender}{Name} "."=>". "$h{sender}{type}"."\n";


    Mais cette fonction me retourne juste le dernier élément et je sais pas comment mettre les autres données des balises restantes dans cette table de hachage:/

  9. #9
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Pour faire simple, que veux-tu exactement récupérer à partir de ton XML ?
    Donne un exemple de résultat.

  10. #10
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 33
    Points : 17
    Points
    17
    Par défaut
    En faite mon fichier xml comprend différentes balises.Voila un extrait du fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     <SENDER UUID="DCE:d393ee1a-bed4-4144-998f-119e386b5772">
              <SHORT-NAME>Sender1_API</SHORT-NAME>
              <LONG-NAME>Sender12_API</LONG-NAME>
              <DATA-ELEMENTS>
                <DATA-ELEMENT-PROTOTYPE UUID="DCE:d0264a73-2758-4797-a4f4-73754b860a49">
                  <SHORT-NAME>Sender1</SHORT-NAME>
                  <LONG-NAME>Sender12</LONG-NAME>
                  <TYPE-TREF>UInt8</TYPE-TREF>
                  <IS-QUEUED>false</IS-QUEUED>
                </DATA-ELEMENT-PROTOTYPE>
              </DATA-ELEMENTS>
       </SENDER>
    je veux une table de hachage sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {SENDER =>liste noms:Sender1_API} =>{Data Element=>pour chaque nom une liste des data elements :Sender1
                                                                 =>pour chaque nom le type :UInt8
                                                                 =>pour chaque nom false or true :false
                                                   }
    Pour que je peux ensuite accéder à ces données et créer mon fichier.c comme ceci par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    _STATIC_ VAR( UInt8, RTE_VAR) Rte_Irv_Sender1_1_Sender1_API_1_false;
    Je sais pas si ma question est bien claire maintenant.
    Je serai reconnaissante pour votre aide.

  11. #11
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    je veux une table de hachage sous cette forme :
    Ton hash est pas clair

  12. #12
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 33
    Points : 17
    Points
    17
    Par défaut
    Ce que je veux une fonction qui me permet a accéder aux différentes balises.
    je l'ai fait avec la boucle foreach ...donc chaque fonction accède à chaque balise avec la boucle foreach => perte du temps.

    Par conséquent je veux mettre tout le fichier xml dans une table de hachage multidimensionnelle comme ceci:
    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
     
    %hash=(Sender=>{
                               Sender1_API=>{
                                                      Data Element=>{
                                                                                name=>{Sender1
                                                                                         Sender2
                                                                                          ....}
                                                                                type=>{UInt8
                                                                                        UInt16
                                                                                          ...}
                                                                                 boolean=>{true
                                                                                             false}
                                                                               }
                               Sender2_API=> même chose ici 
                                ..... }

  13. #13
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 33
    Points : 17
    Points
    17
    Par défaut
    En faite ,si pas possible de faire ça avec hash..Prière de me donner une méthode qui me permet de faire ça avec xml::twig

  14. #14
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Plusieurs choses ne sont pas claires :
    - pourquoi veux-tu passer par un hash alors que le résultat final est du code C : pourquoi ne pas directement produire du code C (surtout que ton hash ne semble pas être une transposition directe du fichier XML d'origine).
    - ensuite, dans la génération du fichier C, tu devrais indiquer par des marqueurs spéciaux, quels éléments de la chaine de caractère C correspondent aux différents éléments XML, par exemple en l'écrivant ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _STATIC_ VAR(<TYPE-TREF>, RTE_VAR) Rte_Irv_<DATA-ELEMENT-PROTOTYPE/SHORT-NAME>_1_<SHORT-NAME>_1_<IS-QUEUED>;

    Dans cet exemple, les valeurs 1 sont non déterminées... à savoir il faudrait préciser si ce sont des numéros, et de quelles manières il sont incrémentés.

    D'autres exemples utiles dans les cours et tutoriels pour apprendre Perl : http://perl.developpez.com/cours/
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  15. #15
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 33
    Points : 17
    Points
    17
    Par défaut
    Pour être claire,
    Le script prend comme Input une vingtaine de fichiers xml qui sont définies d'une manière standard (de même balises et même niveaux).
    Alors par exemple il va chercher le nom du composant Software dans tout les fichiers, comme l'exemple ci dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <TOP-LEVEL-PACKAGES>
        <AR-PACKAGE UUID="DCE:61e66544-4650-4686-8081-606d58afe3c4">
          <SHORT-NAME>AdvCord_Package</SHORT-NAME>
    </AR-PACKAGE>
      </TOP-LEVEL-PACKAGES>
    le nom est "AdvCord_Package" pour un fichier.

    Donc ,en conclusion, il faut générer un fichier.c (output) qui met une liste de ces noms comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <Rte_AdvCord_Package.h>
    #include <Rte_AdvMax.h>
    #include <Rte_AdvMin.h>
    #include <Rte_AdvOptm.h>
    #include <Rte_AdvPrevKnk.h>
    #include <Rte_AdvSp.h>
    #include <Rte_AFA.h>
    #include <Rte_AFAMgt.h>
    #include <Rte_AirSysMair.h>
    #include <Rte_AirSysThrAr.h>
    les noms des composants sont en gras
    Donc,j'ai pensé a la table de hachage comme base de donnée dans laquelle je peux mettre toutes les données des fichiers xml puis accéder a cette table de hachage pour manipuler les données nécessaires .

    PS:ceci est faisable avec xml::twig ou xml::simple? en prenant en compte l'optimisation du mémoire et la rapidité de l'exécution

  16. #16
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    C'est faisable et il est très fortement recommandé d'utiliser XML::Twig. Maintenant, comme pour tout programme, c'est l'algorithme qui fait que ton programme sera optimisé, correcte...

    Dans ton cas, il est complétement inutile de vouloir utiliser un module qui optimise le parsing d'un XML si c'est pour au final remettre le XML dans un hash, donc en mémoire !

    Il faut juste comprendre la logique du module XML::Twig par rapport à ton besoin et utiliser un peu d'huiles de coude.

    Pour ton exemple ci-dessus peux-tu nous mettre deux fichiers XML histoire que je puisse te faire un programme d'exemple ?

  17. #17
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Voici un exemple basique :

    test1.xml
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-8"?>
    <TOP-LEVEL-PACKAGES>
    	<AR-PACKAGE UUID="DCE:61e66544-4650-4686-8081-606d58afe3c4">
    		<SHORT-NAME>AdvCord_Package</SHORT-NAME>
    	</AR-PACKAGE>
    </TOP-LEVEL-PACKAGES>


    test2.xml
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-8"?>
    <TOP-LEVEL-PACKAGES>
    	<AR-PACKAGE UUID="DCE:61e66544-4650-4686-8081-606d58afe3c4">
    		<SHORT-NAME>AdvMax</SHORT-NAME>
    	</AR-PACKAGE>
    </TOP-LEVEL-PACKAGES>

    Programme
    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/perl
    use strict;
    use warnings;
    use XML::Twig;
     
    my @fichiers_xml = (
    	'test1.xml',
    	'test2.xml',
    );
    my $output_file = 'output.c';
     
    open my $fh_xml_final, '>', $output_file or die "Impossible de créer le fichier $output_file\n";
    foreach my $fichier ( @fichiers_xml ) {
    	# Analyse du fichier XML
    	print "Fichier : $fichier\n";
     
    	my $twig_xml = XML::Twig->new(
    		Twig_handlers      => {
    			'SHORT-NAME' => \&get_short_name,
    		},
    	);
    	$twig_xml->parsefile($fichier);
    	$twig_xml->purge;
    }
    close $fh_xml_final;
     
    sub get_short_name {
    	my ($twig, $twig_shortname) = @_;
     
    	my $nom_package = $twig_shortname->text;
    	if ( defined $nom_package ) {
    		print {$fh_xml_final} '#include <Rte_' . $nom_package . '.h>' . "\n";
    	}
    }
    output.c :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <Rte_AdvCord_Package.h>
    #include <Rte_AdvMax.h>

  18. #18
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 33
    Points : 17
    Points
    17
    Par défaut
    J'ai fait un essai avec le module XML::Twig qui met en input un seul fichier xml ,j'ai utilisé chaque fonction une boucle Foreach pour accéder à chaque nœud (balise) dans mon fichier xml:
    exemple de fonction:

    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
    # Fonction qui renvoie le nom du runnable variable et son type
    sub b 
    {	
        my $taille=0;
    	my @t=();
    	my @c=();	
    	foreach my $search($root->findnodes("//ELEMENTS/INTERNAL-BEHAVIOR/INTER-RUNNABLE-VARIABLES/INTER-RUNNABLE-VARIABLE "))
    	{	
    		my $name=$search->field('SHORT-NAME');
    		my $type=$search->field('TYPE-TREF');
    		my $type1=substr($type,15);
    		push (@c,$name);
    		push (@t,$type1);
    		$taille++;
    	}
    	for (my $i=0;$i<$taille;$i++)
    	{
    		print {$FhResultat} "_STATIC_ VAR($t[$i], RTE_VAR) Rte_Irv_",&a,"_1_$c[$i];\n";
    	}
    }
    son output est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    _STATIC_ VAR(UInt8, RTE_VAR) Rte_Irv_AdvCord_1_IgSys_prm_agIgTestCyl_1_irv;
    _STATIC_ VAR(UInt8, RTE_VAR) Rte_Irv_AdvCord_1_IgSys_prm_agIgTestCyl_2_irv;
    _STATIC_ VAR(UInt8, RTE_VAR) Rte_Irv_AdvCord_1_IgSys_prm_agIgTestCyl_3_irv;
    _STATIC_ VAR(UInt8, RTE_VAR) Rte_Irv_AdvCord_1_IgSys_prm_agIgTestCyl_4_irv;
    _STATIC_ VAR(UInt8, RTE_VAR) Rte_Irv_AdvCord_1_IgSys_prm_agIgTestCyl_5_irv;
    _STATIC_ VAR(UInt8, RTE_VAR) Rte_Irv_AdvCord_1_IgSys_prm_agIgTestCyl_6_irv;
    _STATIC_ VAR(UInt8, RTE_VAR) Rte_Irv_AdvCord_1_IgSys_agIgOfsTest_irv;
    _STATIC_ VAR(UInt8, RTE_VAR) Rte_Irv_AdvCord_1_IgSys_agIgTest_irv;
    _STATIC_ VAR(UInt8, RTE_VAR) Rte_Irv_AdvCord_1_IgSys_agIgOfs_irv;
    Ma question c'est : si à a chaque fois j'utilise la boucle foreach,ça signifie "perte du temps",car chaque il va falloir reparsser le fichier xml??

    Pour les deux fichiers ,ils sont trés gros, je peux vous les envoyer en Message Privé??

  19. #19
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Citation Envoyé par tunwim Voir le message
    Ma question c'est : si à a chaque fois j'utilise la boucle foreach,ça signifie "perte du temps",car chaque il va falloir reparsser le fichier xml??
    Si ton algo est mauvais, le prog le sera aussi et la perte de temps sera dû à ton mauvais algo, cela n'a rien avoir avec le module.

    Que tu roules en Twingo ou en ferrari, si tu roules en deuxième, tu n'es pas prêtes à rouler à 130Km/h. Il faut juste savoir se servir de sa machine, donc de son module !

    Regarde le programme que je t'ai fait plus haut. Essaye de t'en inspirer, donne nous plus d'informations et on essayera de t'aider.

  20. #20
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 33
    Points : 17
    Points
    17
    Par défaut
    ok merci bien pour ce code ,il est très utile.
    donc je vais modifier mon algo et je vais t'informer de ce que ça donne.
    Mais,avec twig_handlers , l’appellation se fait quand le twig trouve la balise correspondante,donc dans l'ordre du fichier et du balise.

    Et si je veux appeler une fonction en prenant en compte un ordre qui respecte ce que je veux générer (output.c), je fais quoi donc ?

Discussions similaires

  1. Script d'import d'un fichier XML dans une table SQL-Server
    Par thiersco dans le forum Développement
    Réponses: 2
    Dernier message: 26/11/2013, 09h45
  2. Réponses: 5
    Dernier message: 24/11/2010, 14h54
  3. [SSIS] [2K8] importer fichier xml dans une table
    Par Tankian dans le forum SSIS
    Réponses: 1
    Dernier message: 15/04/2009, 12h34
  4. import fichier XML dans une table oracle 10g
    Par aijedelachance dans le forum Import/Export
    Réponses: 0
    Dernier message: 08/02/2009, 21h52
  5. Charger Fichiers XML dans une table avec SQL*LOADER
    Par devdev2003 dans le forum SQL
    Réponses: 2
    Dernier message: 14/01/2008, 10h40

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