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.