Modification XML en Perl

ldld Messages postés 11 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
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?
Configuration: Windows Vista
Firefox 3.0.1

6 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  2. ldld Messages postés 11 Statut Membre
     
    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
  3. ldld Messages postés 11 Statut Membre
     
    Salut,

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

    merci d'avance
    -1
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      j'aurais besoin de tes 2 fichiers pour pouvoir t'aider
      -1
  4. ldld Messages postés 11 Statut Membre
     
    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
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

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