perl + xml

perl + xml - Perl - Programmation

Marsh Posté le 09-10-2013 à 23:43:26    

Bonsoir,  
 
j'ai le code suivant :  

Code :
  1. use strict;
  2. use warnings;
  3. use autodie;
  4. use XML::TreeBuilder;
  5. my %h1;
  6. my $tree = XML::TreeBuilder->new();
  7. $tree->parse_file('/home/hp/Bureau/fic2.xml');
  8. my @mots = $tree->find('mot');
  9. foreach (@mots) {
  10.         s/^\s+|\s+$//g;
  11.         next if (/^$/);
  12. my ($synonyme, $etiquette);
  13. foreach ($_->descendants()) {
  14.    my $tag = $_->tag();
  15.    if ($tag ~~ "synonyme" ) {
  16.      $synonyme = ($_->content_list())[0];
  17.         next if (ref($synonyme));
  18.         $synonyme =~ s/^\s+|\s+$//g;
  19.         next if ($synonyme ~~ /^$/);
  20.    }
  21.    if ($tag ~~ "etiquette" ) {
  22.      $etiquette = ($_->content_list())[0];
  23.     next if (ref($etiquette));
  24.         $etiquette =~ s/^\s+|\s+$//g;
  25.         next if ($etiquette ~~ /^$/);
  26.      $h1{$synonyme} = $etiquette;
  27.    }
  28. }
  29. }
  30. $tree->delete;
  31. my %h2;
  32. $tree = XML::TreeBuilder->new();
  33. $tree->parse_file('/home/hp/Bureau/fic3.xml');
  34. my @classes = $tree->find('classe');
  35. foreach (@classes) {
  36. s/^\s+|\s+$//g;
  37.         next if (/^$/);
  38. #my $synonyme = $_->{'synonyme'};
  39.        # next if (ref($synonyme));
  40. my ($nom, $etiquette);
  41. foreach ($_->descendants()) {
  42.    my $tag = $_->tag();
  43.    if ($tag ~~ "nom" ) {
  44.      $nom = ($_->content_list())[0];
  45. next if (ref($nom));
  46.         $nom =~ s/^\s+|\s+$//g;
  47.         next if ($nom ~~ /^$/);
  48.    }
  49.    if ($tag ~~ /^etiquette\d+$/) {
  50.      $etiquette = ($_->content_list())[0];
  51. next if (ref($etiquette));
  52.         $etiquette =~ s/^\s+|\s+$//g;
  53.         next if ($etiquette ~~ /^$/);
  54.      $h2{$etiquette}= $nom;
  55.    }
  56. }
  57. }
  58. $tree->delete;
  59. open my $fh,  "<:utf8", '/home/hp/Bureau/out33.txt';
  60. open my $fh1, ">:utf8", '/home/hp/Bureau/resultatML.txt';
  61. my $linenum = 0;
  62. my (@bloc, @words);
  63. foreach(<$fh> ) {
  64. unless ($linenum++ or not /^\x{feff}/) {
  65.    s/^\x{feff}// ;
  66. }
  67. if (/^\s*$/) {
  68.    if (0+@bloc) {
  69. print $fh1 join(" + ", @bloc), "\n";
  70.      @bloc = ();
  71.    }
  72. }
  73. else {
  74.    s/^\s+|\s+$//g;
  75.    @words = split /\s+/;
  76.    if (defined($h1{$words[0]}) and defined($h2{$h1{$words[0]}})) {
  77. unless  ($h2{$h1{$words[0]}} ~~ "Ponctuation" ) {
  78.        push @bloc, $h2{$h1{$words[0]}};
  79.    }
  80.    }
  81.    else {
  82.       push @bloc, "???";
  83.    }
  84. }
  85. }
  86. if (0+@bloc) {
  87. print $fh1 join(" + ", @bloc), "\n";
  88. }
  89. close $fh;


 
avec out33.txt  
أَيْ confirmation  
تْفَضَّلْ politesse  
خُويَا nomination  
. Point  
مْعَ etiq  
وَقْتَاشْ outil question demande horaire  
بِاللهْ demande  
التْرَانْ marq train  
يِمْشِي marq depart  
؟ Point_Interrogation  
fic2.xml
 
 
<mot>
<synonyme>!</synonyme>
<etiquette>Point Exclamation</etiquette>
</mot>
 
<mot>
<synonyme> . </synonyme>
<etiquette>point</etiquette>
</mot>
 
<mot>
<synonyme>؟</synonyme>
<etiquette>Point_Interrogation</etiquette>
</mot>
 
<mot>
<synonyme>أَيْ</synonyme>
<etiquette>confirmation</etiquette>
</mot>
 
<mot>
<synonyme>تْفَضَّلْ </synonyme>
<etiquette>politesse</etiquette>
</mot>
 
et fic3.xml
<classe>
<nom> Depart </nom>
<etiquette1>  marq depart</etiquette1>
</classe>
 
<classe>
<nom>Ponctuation  </nom>
<etiquette1>  Point_Exclamation  </etiquette1>
<etiquette2>  point  </etiquette2>
<etiquette3>  Point_Interrogation</etiquette3>
</classe>  
...
 
la sortie  de mon programme est la suivante :  
Confirmation + Politesse + Nomination + Vide + Question + Demande + Train + Depart
 
comment puis je modifier le code pour avoir comme resultat :  
Confirmation + Politesse + Nomination  
Vide + Question + Demande + Train + Depart
 
Merci d'avance

Reply

Marsh Posté le 09-10-2013 à 23:43:26   

Reply

Marsh Posté le 10-10-2013 à 01:31:36    

Il vient d'ou ce Vide?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-10-2013 à 08:39:40    

gilou a écrit :

Il vient d'ou ce Vide?
A+,


Bonjour ,  
En fait dans la sortie , je veux qu'a chaque fois il trouve un signe de ponctuation il fait un retour a la ligne :
 
avec out33.txt  
أَيْ confirmation  
تْفَضَّلْ politesse  
خُويَا nomination  
. Point  
مْعَ etiq  
وَقْتَاشْ outil question demande horaire  
بِاللهْ demande  
التْرَانْ marq train  
يِمْشِي marq depart  
؟ Point_Interrogation
 
donc le resultat sera donc :  
 

Confirmation + Politesse + Nomination  
 Vide + Question + Demande + Train + Depart
 

au lieu de  
Confirmation + Politesse + Nomination + Vide + Question + Demande + Train + Depart
 

Reply

Marsh Posté le 10-10-2013 à 11:37:49    

Donc clairement il va falloir remplacer le  
unless  ($h2{$h1{$words[0]}} ~~ "Ponctuation" ) {
       push @bloc, $h2{$h1{$words[0]}};
   }
par un  
if ($h2{$h1{$words[0]}} ~~ "Ponctuation" ) {
       push @bloc, "\n";
}  
else {
       push @bloc, $h2{$h1{$words[0]}};
}
je pense.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-10-2013 à 11:53:54    

bonjour,  
oui cous avez raison sauf que il ya un signe "+" de plus à la fin et au début de chaque ligne
Confirmation + Politesse + Nomination +  
 + Vide + Question + Demande + Train + Depart +  
 + ??? + Politesse + Nomination +  
 
??? + Politesse + Nomination +


Message édité par rim_enis le 10-10-2013 à 11:54:44
Reply

Marsh Posté le 10-10-2013 à 13:23:45    

En effet. Dans ce cas la, ceci devrait faire l'affaire:
if ($h2{$h1{$words[0]}} ~~ "Ponctuation" ) {  
       my $truc = pop @bloc;
       $truc = $truc . "\n";
       push @bloc, $truc;  
}  
.....
 
Et il faudra éventuellement tenir compte du cas ou @bloc est vide (tester si ça passe ainsi ou s'il faut un test spécifique et du code pour en tenir compte).
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-10-2013 à 13:50:07    

j'ai testé juste le signe "+" à la fin sont enlevé , ainsi il ya des lgnes vide
 
voici le resultat :
 
Confirmation + Politesse + Nomination
 + Vide + Question + Demande + Train + Depart
 
 + ??? + ??? + ??? + ??? + Vide + Question + ??? + ??? + ???
 
 + ??? + Vide + Vide + ??? + ??? + ??? + ??? + ???
 + ??? + ??? + Vide + ??? + ??? + ??? + Demande + Tichet + ??? + ???
 + ??? + ??? + ??? + ???
 + ??? + ???
 + ??? + ??? + ??? + Question + Depart + ???

Reply

Marsh Posté le 10-10-2013 à 14:49:03    

Ah, j'avais pas fait attention au fait que vous ne vouliez pas de + en début de ligne.
Dans ce cas la le plus simple est de positionner un flag $punc pour savoir qu'on a rencontré de la ponctuation:
 
     @words = split /\s+/;
     my $punct = 0;
          .....................
     if ($h2{$h1{$words[0]}} ~~ "Ponctuation" ) {  
         $punct = 1;
    }  
    else {  
           my $truc;
           if ($punct) {
               $truc = pop @bloc;  
               $truc = $truc . "\n". $h2{$h1{$words[0]}};  
               $punct = 0;  
           }
           else {
               $truc = $h2{$h1{$words[0]}};  
           }
           push @bloc, $truc;  
    }  
 
Bon, c'est du code pas testé, mais ça donne l'idée.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-10-2013 à 20:12:07    

le problème est resolu, mais y'a t'il un moyen d'eliminer les lignes vide ds la sortie

Reply

Marsh Posté le 10-10-2013 à 21:12:08    

Je ferais
    chomp;
    s/^\s+|\s+$//g;
   @words = split /\s+/;
    ...
et ça réglera peut être le problème.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-10-2013 à 21:12:08   

Reply

Marsh Posté le 10-10-2013 à 22:00:22    

Non il reste encore des ligne vide mme avec chomp

Reply

Marsh Posté le 10-10-2013 à 23:54:48    

Je ne peux pas vous en dire plus, les fichiers xml que vous me donnez en exemple, et en particulier fic3.xml,  ne sont pas avec assez de données pour que je puisse faire des tests utiles.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed