Modification XML en Perl

Fermé
ldld Messages postés 11 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 12 septembre 2008 - 28 août 2008 à 17:54
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 1 sept. 2008 à 09:11
Bonjour,
bonjour,

J'ai un fichier xml, et j'ai la traduction de ce fichier en txt. je dois régénérer le même fichier xml mais avec le txt de la traduction.
c'est à dire je garde la même structure xml et je change seulement le texte.

J'ai pensé à cette solution comme je travaille en Perl:
mettre le doc cible dans une liste et remplacer les lignes du doc source.

mon code Perl:
open (FR, "fr.xml");
$/= undef;

while ($linefr=<FR>)
{
if ($linefr =~ /(<.+>+)([^<]+)(<\/.+>)/mg)
{$m = $2;}
print $m;
}
open (AR, "ar.txt");
while ($linear = <AR>)
{@ar = $linear;

for ($i=0;$i<@ar;$i++)
{
$m = $ar[$i];
print $m;
}
}

Le problème c que je veux regénérer le fichier xml que j'ai lu au départ (fr.xml)?
je débute en Perl, si vous avez d'autres idées bcp mieu?

je vous remercie?
A voir également:

6 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
28 août 2008 à 19:53
Salut,

On pourra avoir peut être des idées, mais il faut que tu nous aides ;-)

Voici en quoi tu peux nous aider.
1. tu nous affiche ton fichier xml (tu peux le mettre sur cjoint.com)
2. tu nous dit ce que tu veux traduire

mettre le doc cible dans une liste et remplacer les lignes du doc source.
Il y plusieurs moyens pour traiter un fichier en Perl.

Par exemple

1. tu peux utiliser un fichier temporaire
2. tu peux créer carrément un nouveau fichier suite au traitement de(s) fichier(s)
3. tu peux faire des modifications directement tout en sauvegardant l'original

Je pense que l'utilisation d'une liste n'est pas vraiment nécessaire, mais bon, je ne peux rien dire tant que je ne sais pas exactement ce que tu veux obtenir ;-)


Le mode slurp n'est pas vraiment nécessaire.
De toute façon si le mode slurp est activé tu peux mettre dans une variable scalaire le contenu de fichier

Quand tu écris

$/= undef;

while ($linefr=<FR>)


c'est un peu inutile de faire une boucle sur le handle FR puisqu'il n'y a qu'une seule chaine qui contiens des caractères de saute de lignes à l'interieur

Voici un exemple
lami20j@debian:~/trash$ cat slurp.txt
ligne1
ligne2
ligne3
lami20j@debian:~/trash$ cat slurp.pl
#!/usr/bin/perl
#
open FR,"slurp.txt" or die "E/S : $!\n";
$/= undef; #mode slurp

while ($linefr=<FR>){ # boucle inutile, il y a une seule ligne
        print "ligne numéro $. = > $linefr\n";
}
__END__
lami20j@debian:~/trash$ perl slurp.pl
ligne numéro 1 = > ligne1
ligne2
ligne3

Donc le résultat te montre bien qu'il n'y a qu'une seule ligne
Ce qui veut dire qu'il suffit de s'occuper seulement de la variable scalaire
lami20j@debian:~/trash$ cat slurp.pl
#!/usr/bin/perl
#
open FR,"slurp.txt" or die "E/S : $!\n";
$/=undef;
$linefr=<FR>;
print "$linefr\n";
__END__
lami20j@debian:~/trash$ perl slurp.pl
ligne1
ligne2
ligne3
En revanche en désactivant le mode slurp on vois bien les 3 lignes

lami20j@debian:~/trash$ cat slurp.pl
#!/usr/bin/perl
#
open FR,"slurp.txt" or die "E/S : $!\n";
while ($linefr=<FR>){
        print "ligne numéro $. = > $linefr\n";
}
__END__
lami20j@debian:~/trash$ perl slurp.pl
ligne numéro 1 = > ligne1

ligne numéro 2 = > ligne2

ligne numéro 3 = > ligne3

lami20j@debian:~/trash$


-1
ldld Messages postés 11 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 12 septembre 2008
28 août 2008 à 20:53
Merci pour ces explication:

avant tt je débute en Perl.

j'ai un fichier xml voilà un extrait :
<text id="x.c.hr.un.1979.fr" lang="fr">
<front>
<div type="update">
<p id="un.1979.fr_U.P">blblblblbl</p>
</div>
</front>
<body>
<head id="un.1979.fr_H">blblblblblb</head>
<div type="preamble">
<list type="simple">
<item id="un.1979.fr_B.i-1">
<seg type="membrestates">titre</seg>
</item>
<item>
<seg type="context">
<list type="simple">
<item id="un.1979.fr_B.i-2.i-1">le n°1 de la liste</item>

et j'ai la traduction de ce fichier en anglais en txt.

le but est de générer la même structure xml en utilisant le fichier text (remplacer ce qui est en gras par la traduction. l'objectif est d'avoir deux fichiers xml de même structure dans les deux langues.

mon code Perl:
open (FR, "<convention27.fr.xml") or die "impossible d'ouvrir le fichier $ : $!\n";

while ($line2=<FR>)
{
$line2 =~ s/ +/ /g;

if($line2 =~ />([^<]+)([<\/]+)/mg) #cette regexp reconnait tout le texte entre les balise xml
{
$m = $1;
print "$m\n";
@fr = split (/\n/,$m);
}
}

open (AR,"<:utf8","conv_fem.txt");
while ($line =<AR>)
{
if (length $line<=15) # j'ai enlevé les ligne dont j'ai pas besoin
{
$res = $line;
}
$line =~s/$res//g;
@ar = $line;
for ($i=0;$i<@fr;$i++)
{
$fr[$i]=$ar[$i];
}
$m = join ("\n",@fr);
print $m;
}

avec ce programme je remplace les deux listes.
Je peux même changer le texte du fichier xml sans le mettre dans une liste @fr.

je veux récupérer mon fichier xml de départ avec les modifications que je viens de faire sur la $m.

Merci pour ton aide
-1
ldld Messages postés 11 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 12 septembre 2008
29 août 2008 à 21:58
Salut,

Si vous avez des idées sur ma question sur modification de fichier XML par Perl?

merci d'avance
-1
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
30 août 2008 à 08:46
Salut,

j'aurais besoin de tes 2 fichiers pour pouvoir t'aider
-1
ldld Messages postés 11 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 12 septembre 2008
31 août 2008 à 00:46
salut;

je t envoyé les deux fichiers xml et txt dans cjoint.com
texte_anglais_balise
et l'autre traduction

merci pour ton aide.
-1
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
31 août 2008 à 08:24
Salut,

quand tu mets les fichiers sur cjoint.com 2 liens sont crées
il me faut ces deux liens, sinon je ne peux pas télécharger les fichiers.

en fait, pour être sur que le format ne souffre, vaut peut être mieux mettre les fichiers dans une archive (gzip, bzip2, zip, rar, etc.)
-1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ldld Messages postés 11 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 12 septembre 2008
31 août 2008 à 22:51
voilà les deux crées suite à l'insertion des fichiers ds cjoint

https://www.cjoint.com/?iFwV5ZM02y pour le fichier texte
https://www.cjoint.com/?iFwXqNFKg4 pour le fichier Xml

a partir du fichier Xml je vx créer celui de la traduction.

Merci
-1
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
1 sept. 2008 à 09:11
Salut,

ok pour les fichiers
je vais regarder ce soir ;-)
-1