Forum Programmation.perl XML-Parser

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-1
2
avr.
2015

quelqu'un peut il m'aider a faire le parsage de ce fichier de manier a ce qu'il retourne juste les Names et les values. j'ai ecrit un code qui malheureusement ne fonctionen pas. Merci

    <?xml version="1.0" encoding="UTF-8"?>
      <Profile origin="get" version="2.1" date="2013.05.20">
                         <Catalog id="sys" version="2.1">
                          <Parameter name="prim" value="2"/>
                           <Parameter name="second" value="3"/>
                           <Parameter name="copy" value="4"/>
                           <Parameter name="force" value="1"/>
                           <Parameter name="always" value="0"/>
                          <Parameter name="type" value="5" Type="False"/>
                          <Parameter name="memory" value="allow"/>
                         </Catalog>
                        </profile>
  • # en Python, avec lxml et objectify, par exemple ?

    Posté par  (site web personnel) . Évalué à 2.

    tu peux montrer ton code ?

    ウィズコロナ

    • [^] # Re: en Python, avec lxml et objectify, par exemple ?

      Posté par  . Évalué à 1. Dernière modification le 02 avril 2015 à 16:57.

      use Data::Dumper;
      use XML::Simple qw(:strict);
      my $ref = XMLin(
              'compute_sys.xml',
              ForceArray      => 1,
              KeyAttr         => [],
      );
      print Dumper($ref);
  • # po

    Posté par  . Évalué à 1.

    j#
    'aimerai qu'il me retourne cela en ligne comme le suivant :
    prim,second,copy,forced,always,type,memory,name1,name2,………

    • [^] # Re: po

      Posté par  . Évalué à 2.

      Avec XML::Twig, je ferais comme ça :

      use strict;
      use warnings;
      use XML::Twig;
      
      my $twig= XML::Twig->new(
                     twig_handlers => { 'Parameter' => sub { $, = ",";
                                                            print
                                                              $_->{'att'}->{'name'},$_->{'att'}->{'value'} . $,
                                                            }
                                      }
                     );
      
      $twig->parsefile('test.xml');

      ce qui donne : prim,2,second,3,copy,4,force,1,always,0,type,5,memory,allow,

      Ne resterait plus qu'à nettoyer la virgule finale.

      Après, comme toujours en Perl, il y a d'autres manières de faire.

      • [^] # Re: po

        Posté par  . Évalué à 1.

        ca fonctione merci bien , c'est tres gentil de votre part, et si je voulais qu'il me retourne aussi le nom du fichier , pourrai je ajoute. je dis dans le fait que je voudrais qu'il me retourne comme suit, sachant le fichier est sauvegarder sous le nom compute_sys.xml. serait tres gentil de votre part. Merci

        compute,prim,2,second,3,copy,4,force,1,always,0,type,5,memory,allow,

        • [^] # Re: po

          Posté par  . Évalué à 1.

          Juste avant le parsefile, tu écris un print de ton nom de fichier suivi par une virgule et tu auras le résultat souhaité.

          • [^] # Re: po

            Posté par  . Évalué à 1. Dernière modification le 03 avril 2015 à 14:07.

            j'espere que cest ce que vous vouliez dir
            print $FhResult 'd100spuptl25e0_sysdumpdev.txt,' ;

            $twig->parsefile('d100spuptl25e0_sysdumpdev.txt');

            il me produit certe un resultat mais avec une erreur elle est la suivante:

            C:\Users\IBM_ADMIN\Documents>perl new2.pl
            mismatched tag at line 12, column 5, byte 626 at C:/strawberry/perl/site/lib/XML
            /Parser.pm line 187.
            at new2.pl line 17.
            at new2.pl line 17.

            • [^] # Re: po

              Posté par  . Évalué à 1.

              voici un code permetant de separe les chaines de caractere mes comment l'inserer dans mon code plus haut de maniere a se qu'il me retourne une partie du nom sous lequel mon fichier a ete sauvegarde et ainsi que les names et les values.

              my $data = 'd100spuptl25e0_sysdumpdev.txt';
              (@part) = split(/_/,$data,2);
              print $part[0];

              • [^] # Re: po

                Posté par  . Évalué à 1.

                si j'ai bien compris (ce dont, je ne suis pas sûr), mettre ce genre de chose avant le parsefile :

                print( (split('_', 'd100spuptl25e0_sysdumpdev.txt',2))[0] . ',' );
                • [^] # Re: po

                  Posté par  . Évalué à 1.

                  Merci bien ca fonctione. j'avais encore une question surtou faut pas dire que celui si il pose trop de question. au fait si vous voyez mon code Les fichiers on ete declarer, existe il un moyen que je puisse sur l'editor de perl-stwaberry d'appele mes Fichiers, sans toute fois devoir les declare dans mon code , si je demande c'est parceque j'ai trop de fichier et je n'aimerai pas tous les ecrire dans mon code mais juste pouvoir les a partir der l'editor de Perl-Strawberry les appeles.
                  Merci

                  • [^] # Re: po

                    Posté par  . Évalué à 1.

                    il faut pour ça que tu t'intéresses au tableau @ARGV. La documentation est là : http://perldoc.perl.org/perlvar.html

                    si tu appelles ton script perl comme ça.

                    ./script.pl fichier.xml
                    

                    le nom de ton fichier.xml peut être récupéré dans ton script.

                    • [^] # Re: po

                      Posté par  . Évalué à 1.

                      my ($filename) = shift @ARGV;    
                       open (my $fh, '<', $filename) or die "file '$filename' not found";        
                      ```ceci sont les deux ligne que je pense bien qu'il me faut insere dans mon code mais depuis deja pratiquement 2 Jours je n'arrive pas et je sais que la command d'appelle est la suivante :
                          perl parser.pl doc1.xml       
                      
                      parser.pl est le nom sou lequel j'ai sauvegarde mon code et doc celui sous lequel j'ai sauvegarde mon Fichier. quelqu'un peut il me dire comment l'insere dans mon code.
                      
                      Merci
                      
            • [^] # Re: po

              Posté par  . Évalué à 1.

              Oui, c'est ce que je voulais dire.

              Pour ton erreur, elle me semble assez explicite :

              mismatched tag at line 12, column 5, byte 626 at C:/strawberry/perl/site/lib/XML/Parser.pm line 187.

              C'est ton fichier XML qui est mal formé ; s'il est exactement comme celui que tu montres dans ta question initiale, c'est ta balise <Profile> qui n'est jamais fermée. Il y a bien une balise fermante </profile>, mais ce n'est pas la même casse (un p minuscule au lieu d'une capitale), donc ton analyseur syntaxique est complètement perdu. D'où l'erreur.

              • [^] # Re: po

                Posté par  . Évalué à 1.

                merci bien j'en ai fait la remarque

      • [^] # Re: po

        Posté par  . Évalué à 1.

        Salut Nicolas j'aimerai que tu me viennes une fois de plus en aide:
        j'aimerai change le code de maniere a ce qu'il me retourne quelque chose d'autre , auf fait j'execute mon code sur un Premier fichier (fichier de reference) qui nous retourne juste les names prim, second,copy,force,always, type, memory ensuite j'execute parallement sur un second fichier qui examine chaque fois si a chaque name correspond une value et me le retourne dans un exemple suivant 2, 3, 4, 1, 0, 5, allow dans le cas ou il ya un name qui 'a pas de correspondance value il doit me retourne dans le champs correspondant fault voici un apercu 2, fault, 3, 4, 1, fault, 0.

        • [^] # Re: po

          Posté par  . Évalué à 1.

          Ce serait plus parlant si tu montrais un exemple de ton fichier référence et un exemple de ton second fichier. Parce que là, j'ai pas compris grand-chose.

          • [^] # Re: po

            Posté par  . Évalué à 1. Dernière modification le 09 avril 2015 à 21:10.

            voici mon fichier de reference il est le meme que celui plus haut, delui j'en ai besoin que des names et le parser sur l# attribut nom nous retourne: prim, second, copy, forced, always, Type, memory

                <?xml version="1.0" encoding="UTF-8"?>
                  <Profile origin="get" version="2.1" date="2013.05.20">
                                     <Catalog id="sys" version="2.1">
                                      <Parameter name="prim" value="2"/>
                                       <Parameter name="second" value="3"/>
                                       <Parameter name="copy" value="4"/>
                                       <Parameter name="force" value="1"/>
                                       <Parameter name="always" value="0"/>
                                      <Parameter name="type" value="5" Type="False"/>
                                      <Parameter name="memory" value="allow"/>
                                     </Catalog>
                                    </profile>

            voici un fichier quelconque il possede par example un parametre de moins, plus presicement le Parameter name="type" value="5" Type="False" que le fichier de reference

                         <?xml version="1.0" encoding="UTF-8"?>
                      <Profile origin="get" version="2.0.1" date="2015-03-19T10:38:58Z">
                       <Catalog id="sysdumpdevParam" version="2.1">
                       <Parameter name="prim" value="/dev/lg_dumplv"/>
                       <Parameter name="second" value="/dev/sysdumpnull"/>
                       <Parameter name="copy" value="/var/adm/ras"/>
                       <Parameter name="forced" value="1"/>
                       <Parameter name="always" value="0"/>
                       <Parameter name="memory" value="disallow"/>
                       </Catalog>
                      </Profile>

            maintenant il doit me retourner en comparaisons avec le fichier de reference la suivante:

            prim,         second,              copy,         forced,    always,    Type,    memory    
             /dev/lg_dumplv,   /dev/sysdumpnull,   /var/adm/ras,     1,         0,      fault ,  disallow

            ca veut dire que dans le cas il ne trouve pas correspondance (value) il ecrit a ce lieu fault, a defaut il retourne ce qui ci trouve comme value.

            Merci bien de votre aide, s'il ya quelque chose a demande , pardon n'hesite pas.

            • [^] # Re: po

              Posté par  . Évalué à 1. Dernière modification le 09 avril 2015 à 21:12.

              salut j'ai ecrit le code de la maniere suivante twig1 qui nous permet le parser du fichier1 et retourne juste les Atributs name et twig2 qui permet le parser du fichier2 et retourne jsute le values, maintenant j'aimerai que dans le twig2 on ecrive une Loop qui permettra d'ecrire "fault" dans le cas ou il ne trouverai pas de corespondance value avec le Fichier2 a defaut il me donne la value correspondante.

              use strict;
              use warnings;
              use XML::Twig;   
              
              my $FileResult = 'result.txt';
              open( my $FhResult, '>', $FileResult ) or die("Unable to open file $FileResult\n$!");
              
              my $twig1= XML::Twig->new(    
                             twig_handlers => { 'Parameter' => sub { $, = ",";  
                                                                    print $FhResult $_->{'att'}->{'name'}. $, 
                                                                    }
                                              }
                             );
              
              print $FhResult( (split('_', "d100spuptl25e0_datei1.xml",2))[0] . ',' ); 
              $twig1->parsefile("d100spuptl25e0_datei1.xml");
              
              my $twig2= XML::Twig->new(
              
                             twig_handlers => { 'Parameter' => sub { $, = ",";
                                                                    print $FhResult $_->{'att'}->{'value'} . $,
                                                                    }
                                              }
                             );
              
              
              print $FhResult( (split('_', "\ndefault_datei2.xml",2))[0] . ',' );
              $twig2->parsefile('default_datei2.xml');
              • [^] # Re: po

                Posté par  . Évalué à 1.

                persone ici ne peut m'aider ? comme je l'ai dis par ailleur j'ai le code plus haut et j'aimerai losrque dans mon datei un parametre ne possede pas d#attribut value , qu'il me retourne a ce niveau "fault"

                • [^] # Re: po

                  Posté par  . Évalué à 2. Dernière modification le 13 avril 2015 à 21:59.

                  Salut Nicola ,

                  juste pour te dire que j'ai reussi voila le code

                  my $twig2= XML::Twig->new(    
                      twig_handlers => { 
                          'Parameter' => sub { 
                              # use 'fault' if name is not defined; Operator '//' is available since perl 5.10.1
                              my $attr_name = $_->{'att'}->{'value'} // 'fault';
                              print $FhResult $attr_name . ",";
                          },
                      },
                  );

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.