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 :

[XML::Twig] et [XML::Writer], problème d'affichage du contenu de balises


Sujet :

Modules Perl

  1. #1
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [XML::Twig] et [XML::Writer], problème d'affichage du contenu de balises
    Bonjour,

    J'ai l'impression que mon problème vient de ma méconnaissance des modules donc je poste ici mais corrigez-moi si je me trompe.

    Comme le dit succinctement le titre, je n'arrive pas à afficher/ré-écrire de façon lisible le contenu des balises qui m'intéressent.

    En entrée, j'ai un fichier XML, dont voici un extrait :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    <?xml version="1.0" encoding="UTF-8"?>
    <wiktionary>
    <entry form="militaire" pageid="51">
    	<etym>Du latin militaris (« qui concerne la guerre ») apparenté à miles (« soldat »).</etym>
    	<lexeme pos="Adj" id="fr_Adj_militaire#0">
    		<defs>
    			<toplevel-def>
    				<gloss>Qui concerne la guerre ou les armées</gloss>
    				<example>Acceptons que le courage militaire demeure l'apanage d'une caste enfantine et bruyante, et ne se répande pas, comme l'a fait la Légion d'honneur, son insigne, parmi les professeurs, les contrôleurs, les peintres ... Jean Giraudoux }, Retour d'Alsace - Août 1914, 1916</example>
    			</toplevel-def>
    			<toplevel-def>
    				<gloss>Destiné à l'usage des troupes.</gloss>
    				<example>Cette voie est une route militaire.</example>
    			</toplevel-def>
    			<toplevel-def>
    				<gloss semantic="Par extension">Autoritaire, discipliné.</gloss>
    				<example>Il avait dit cela avec un ton militaire.</example>
    			</toplevel-def>
    		</defs>
    		<syn>
    			<item target="fr_Adj_martial">martial</item>
    			<item target="fr_Adj_guerrier">guerrier</item>
    		</syn>
    		<ant>
    			<item target="fr_Adj_civil">civil</item>
    		</ant>
    		<trans>
    			<item lang="de" target="de_Adj_militärisch">militärisch</item>
    			<item lang="de" target="de_Adj_soldatisch">soldatisch</item>
    			<item lang="en" target="en_Adj_military">military</item>
    			<item lang="es" target="es_Adj_militar">militar</item>
    			<item lang="io" target="io_Adj_militala">militala</item>
    			<item lang="nl" target="nl_Adj_militair">militair</item>
    			<item lang="cs" target="cs_Adj_vojenský">vojenský</item>
    		</trans>
    	</lexeme>
    	<lexeme pos="N" id="fr_N_militaire#0">
    		<defs>
    			<toplevel-def>
    				<gloss>Personne membre d'une armée.</gloss>
    				<example>Je connais les militaires, ma Julie ; j'ai vécu aux armées. Il est rare que le cœur de ces gens-là puisse triompher des habitudes produites ou par les malheurs au sein desquels ils vivent, ou par les hasards de leur vie aventurière. - Honoré de Balzac }, La Femme de trente ans, 1832</example>
    				<example>Après l'armée des incendiaires, l'armée des voleurs ! Il n'y a pas ici de corps spéciaux. Tout le monde, par le fait qu'il est militaire, fait partie de la grande organisation de pillage. - Pierre Nothomb }, Les barbares en Belgique, 1915</example>
    				<example>Tant qu'il y aura des militaires
    Soit ton fils, soit le mien, 
    On ne verra, par toute la terre
    Jamais rien de bien !
    On te tuera pour te faire taire,
    Par derrière, comme un chien :
    Et tout ça pour rien ! Et tout ça pour rien !  - Rosa Holt }, Giroflé, girofla , 1935</example>
    			</toplevel-def>
    		</defs>
    		<syn>
    			<item target="fr_N_soldat">soldat</item>
    			<item target="fr_N_trouffion">trouffion</item>
    			<item target="fr_N_bidasse">bidasse</item>
    			<item target="fr_N_chair à canon">chair à canon</item>
    			<item target="fr_N_fantassin">fantassin</item>
    			<item target="fr_N_gendarme">gendarme</item>
    			<item target="fr_N_mercenaire">mercenaire</item>
    			<item target="fr_N_milicien">milicien</item>
    		</syn>
    		<trans>
    			<item lang="de" target="de_N_Militär">Militär</item>
    			<item lang="en" target="en_N_soldier">soldier</item>
    			<item lang="en" target="en_N_warrior">warrior</item>
    			<item lang="bm" target="bm_N_sodasu">sodasu</item>
    			<item lang="da" target="da_N_militær">militær</item>
    			<item lang="dog" target="dog_N_sodas">sodas</item>
    			<item lang="es" target="es_N_militante">militante</item>
    			<item lang="eo" target="eo_N_militisto">militisto</item>
    			<item lang="fy" target="fy_N_kriichsman">kriichsman</item>
    			<item lang="el" target="el_N_p??eµ?st??">p??eµ?st??</item>
    			<item lang="la" target="la_N_miles">miles</item>
    			<item lang="la" target="la_N_bellator">bellator</item>
    			<item lang="la" target="la_N_belligerator">belligerator</item>
    			<item lang="nl" target="nl_N_krijgsman">krijgsman</item>
    			<item lang="nl" target="nl_N_krijger">krijger</item>
    			<item lang="nl" target="nl_N_militair">militair</item>
    			<item lang="pap" target="pap_N_guerero">guerero</item>
    			<item lang="ru" target="ru_N_??????">??????</item>
    			<item lang="ru" target="ru_N_????">????</item>
    			<item lang="ru" target="ru_N_?????">?????</item>
    			<item lang="sv" target="sv_N_krigare">krigare</item>
    			<item lang="sv" target="sv_N_militär">militär</item>
    		</trans>
    	</lexeme>
    </entry>
    </wiktionary>
    Je voudrais extraire le mot-vedette (ici "militaire" dans la balise <entry>) associé à ses synonymes (balises <syn>) et antonymes (balises <ant>).
    voici le script que j'utilise :
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #!/usr/bin/perl
    use locale; use strict; use warnings; use XML::Twig; use XML::Writer;
     
    my $FichierXML = $ARGV[0];
     
    warn "traitement de $FichierXML";
    my $twig = XML::Twig->parse($FichierXML);
     
    my @ENTRY = $twig->descendants('entry');
    my @Syno;
    my @Anto;
     
    foreach my $entry ($twig->descendants('entry')){
    	foreach my $tag ($entry->descendants('syn')){
    		my $id = $entry->att('form');
    		my $text = $tag->text;
    		push (@Syno,{
    			"id"=>$id,
    			"entry"=>$text
    		});
    	}
    	foreach my $tag ($entry->descendants('ant')){
    		my $id = $entry->att('form');
    		my $text = $tag->text;
    		push (@Anto,{
    			"id"=>$id,
    			"entry"=>$text 
    		});
    	}
    }
     
    open(outXML, ">sortie_MILITAIRE.xml");
    my $outie =  new XML::Writer (DATA_MODE=>1, DATA_INDENT=>1, OUTPUT => \*outXML);
    $outie->xmlDecl("UTF-8");
    $outie->startTag("wikt", "date"=>"23.07");
    my $i=0;
    my $j=0;
     
    my $ID = "";
     
    foreach my $unit (@Syno){
    	$i++;
    	if ($ID eq $unit->{'id'}){
    		$outie->dataElement("synonyme", $unit->{'entry'});
    	}
    	elsif ($ID eq ""){
    		$ID = $unit->{'id'};
    		$outie->startTag("entry", "id"=>$ID);
    		$outie->dataElement("synonyme", $unit->{'entry'});	
    	}
    	else {
    		$outie->endTag('entry');
    		$ID = $unit->{'id'};
    		$outie->startTag("entry", "id"=>$ID);
    		$outie->dataElement("synonyme", $unit->{'entry'});
    	}
    }
    foreach my $unit (@Anto){
    	$j++;
    	if ($ID eq $unit->{'id'}){
    		$outie->dataElement("antonyme", $unit->{'entry'});
    	}
    	elsif ($ID eq ""){
    		$ID = $unit->{'id'};
    		$outie->startTag("entry", "id"=>$ID);
    		$outie->dataElement("antonyme", $unit->{'entry'});	
    	}
    	else {
    		$outie->endTag('entry');
    		$ID = $unit->{'id'};
    		$outie->startTag("entry", "id"=>$ID);
    		$outie->dataElement("antonyme", $unit->{'entry'});
    	}
    }
    $outie->endTag("entry");
    $outie->endTag("wikt");
    $outie->end( );
     
    print "$i synonymes et $j antonymes dans le fichier sortie.xml\n";
    Ça fonctionne en ce qui concerne le parsing, mais lors de la ré-écriture j'obtiens ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="UTF-8"?>
     
    <wikt date="23.07">
     <entry id="militaire">
      <synonyme>martialguerrier</synonyme>
      <synonyme>soldattrouffionbidassechair à canonfantassingendarmemercenairemilicien</synonyme>
      <antonyme>civil</antonyme>
     </entry>
    </wikt>
    Alors que je voudrais ça par exemple :

    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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <wikt date="23.07">
     <entry id="militaire">
      <synonyme>martial</synonyme>
      <synonyme>guerrier</synonyme>
      <synonyme>soldat</synonyme>
      <synonyme>trouffion</synonyme>
      <synonyme>bidasse</synonyme>
      <synonyme>chair à canon</synonyme>
      <synonyme>fantassin</synonyme>
      <synonyme>gendarme</synonyme>
      <synonyme>mercenaire</synonyme>
      <synonyme>milicien</synonyme>
      <antonyme>civil</antonyme>
     </entry>
    </wikt>
    Merci d'avance pour votre aide
    Topok.

  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 : 499 184
    Points
    499 184
    Par défaut
    Bonjour,

    Chaque synonyme est dans une balise item, pas syn. Là vous prenez syn, donc il concatène tous les textes.

  3. #3
    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 : 499 184
    Points
    499 184
    Par défaut
    Voici un code simplifié en utilisant réellement la force du module XML::Twig.

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #!/usr/bin/perl
    use strict;
    use warnings;
    use XML::Twig;
    use XML::Writer;
     
    my $FichierXML        = $ARGV[0];
    my $FichierXML_output = 'sortie_MILITAIRE.xml';
     
    print "traitement de $FichierXML";
     
    my $twig = new XML::Twig(
    	start_tag_handlers => {
    		'entry' => \&debut_entry,
    	},
    	Twig_handlers => {
    		'entry'    => \&fin_entry,
    		'syn/item' => \&analyse_sync,
    		'ant/item' => \&analyse_ant,
    	},
    );
     
    open my $fh_xml_out, '>', $FichierXML_output or die "Impossible de creer $FichierXML_output\n";
    my $xmlwriter = new XML::Writer(
    	DATA_MODE   => 1,
    	DATA_INDENT => 4,
    	OUTPUT      => $fh_xml_out
    );
    $xmlwriter->xmlDecl('UTF-8');
    $xmlwriter->startTag( 'wikt', 'date' => '23.07' );
     
    $twig->parsefile($FichierXML);
     
    $xmlwriter->endTag('wikt');
    $xmlwriter->end();
    close $fh_xml_out;
     
    sub debut_entry {
    	my ( $twig, $twig_entry ) = @_;
    	my $id = $twig_entry->att('form');
    	$xmlwriter->startTag( 'entry', 'id' => $id );
    }
     
    sub fin_entry {
    	my ( $twig, $twig_entry ) = @_;
    	$xmlwriter->endTag('entry');
    }
     
    sub analyse_sync {
    	my ( $twig, $twig_item ) = @_;
    	$xmlwriter->dataElement( 'synonyme', $twig_item->text );
    }
     
    sub analyse_ant {
    	my ( $twig, $twig_item ) = @_;
    	$xmlwriter->dataElement( 'antonyme', $twig_item->text );
    }

  4. #4
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci mille fois ! Je devenais dingue mais maintenant je comprends où étaient mes erreurs.
    Bonne journée !

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

Discussions similaires

  1. [eZ Publish] Problème d'affichage de contenu Bloc XML
    Par M1000 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 09/03/2010, 16h57
  2. [XML::Twig] vs [XML::Writer]
    Par ellgafsi dans le forum Modules
    Réponses: 1
    Dernier message: 06/05/2009, 14h13
  3. Réponses: 2
    Dernier message: 14/01/2008, 17h32
  4. Problème d'affichage du contenu de JPanel
    Par Mic75 dans le forum AWT/Swing
    Réponses: 12
    Dernier message: 13/12/2007, 00h53
  5. probléme d'affichage du contenu d'un fichier
    Par developppez dans le forum C
    Réponses: 2
    Dernier message: 20/04/2006, 19h16

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