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

Langage Perl Discussion :

Lib XML perl


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 29
    Par défaut Lib XML perl
    Bonjour à tous,
    J'ai un fichier xml de la forme suivante:
    <mediawiki>
    <page>
    <title>page1</title>
    <ns>8</ns>
    <id>6</id>
    <revision>
    <id>2621</id>
    <parentid>6</parentid>
    <timestamp>2005-10-09T01:00:18Z</timestamp>
    <contributor>
    <username>Chaos</username>
    <id>2</id>
    </contributor>
    <model>wikitext</model>
    <format>text/x-wiki</format>
    <text xml:space="preserve">text1</text>
    <sha1>gl8lkltizrxqzwr60fbie01x1lgyurm</sha1>
    </revision>
    </page>
    <page>
    <title>page2</title>
    <ns>8</ns>
    <id>7</id>
    <revision>
    <id>2619</id>
    <parentid>2618</parentid>
    <timestamp>2005-10-09T00:56:39Z</timestamp>
    <contributor>
    <username>Chaos</username>
    <id>2</id>
    </contributor>
    <model>wikitext</model>
    <format>text/x-wiki</format>
    <text xml:space="preserve">text2</text>
    <sha1>n8dordcv6ep0jkar48qrkuqky9f5mmo</sha1>
    </revision>
    </page>
    <page>
    <title>page3</title>
    <ns>8</ns>
    <id>6</id>
    <revision>
    <id>2621</id>
    <parentid>6</parentid>
    <timestamp>2005-10-09T01:00:18Z</timestamp>
    <contributor>
    <username>Chaos</username>
    <id>2</id>
    </contributor>
    <model>wikitext</model>
    <format>text/x-wiki</format>
    <text xml:space="preserve">text3</text>
    <sha1>gl8lkltizrxqzwr60fbie01x1lgyurm</sha1>
    </revision>
    </page>
    <page>
    <title>page4</title>
    <ns>8</ns>
    <id>7</id>
    <revision>
    <id>2619</id>
    <parentid>2618</parentid>
    <timestamp>2005-10-09T00:56:39Z</timestamp>
    <contributor>
    <username>Chaos</username>
    <id>2</id>
    </contributor>
    <model>wikitext</model>
    <format>text/x-wiki</format>
    <text xml:space="preserve">text4</text>
    <sha1>n8dordcv6ep0jkar48qrkuqky9f5mmo</sha1>
    </revision>
    </page>
    </mediawiki>

    L'objectif est de récupérer le continu de chaque <page> dans un fichier .txt dont le nom est le texte de la balise <title> et le continu est celui de <text></text>

    j'ai fait le code suivant :

    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
     
    #Extraction des textes arabes#
     
    use strict;
    use warnings 'all';
    use autodie;
    use utf8;
    use XML::LibXML;
     
     
    my $filename = "pages.xml";
     
    use constant FICHIER_RESULAT   => 'out.txt';
     
    open my $fh_resultat, '>:utf8', FICHIER_RESULAT;
     
     
     
     
    my $parser = XML::LibXML->new();
    my $xmldoc = $parser->parse_file($filename);
    my $file;
    my @tab_file;
    foreach my $page ($xmldoc->findnodes('/mediawiki/page')) {
    foreach my $title ($page->findnodes('/mediawiki/page/title')) {
    #foreach my $rev ($page->findnodes('/mediawiki/page/revision')) {
    #foreach my $text ($rev->findnodes('text/text()')) {
    $file = $title->to_literal();
    my $newfile = "$file.txt";
    push @tab_file, $newfile;
    #open(my $out, '>:utf8', $newfile) or die "Unable to open '$newfile' for write: $!";
    #my $texte = $text->data;  
    #print $out "$text\n"; 
    #close $out;
    #}
    #}
    }
    }
     
    foreach my $page ($xmldoc->findnodes('/mediawiki/page')) {
    foreach my $title ($page->findnodes('/mediawiki/page/title')) {
    foreach my $val(@tab_file) {
    my $titre = $title->to_literal();
    my $newfile = "$titre.txt";
    if($val eq $newfile) {
    foreach my $rev ($page->findnodes('/mediawiki/page/revision')) {
    foreach my $text ($rev->findnodes('text/text()')) {
    open(my $out, '>:utf8', $val) or die "Unable to open '$val' for write: $!";
    my $texte = $text->data;
    print $out "$text\n"; 
    close $out;
    }
    }
    }
    }
    }
    }
    J'ai pu construire les fichiers page1 , page2, page3 et page4 mais ces fichiers contiennent tous text4 !!
    Aide SVP.. et merci beaucoup d'avance

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    On a là une monstruosité des termes du type de produit cartésien multiple...

    Il faut comprendre que findnodes() prend un argument de xpath. Et le neoud qui initie la méthode est le noeud en contexte. Or, le xpath peut être absolu ou relatif. Ce qu'on voit partout est du type absolu, et ça fait mal.

    Prenons par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $xmldoc->findnodes('/mediawiki/page')
    et c'est très bien: on trouve les pages caractérisées par leur titre (page1, page2, page3, page4). $xmldoc est le noeud en contexte et le xpath est absolu. On a quatre termes.

    Et puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $page->findnodes('/mediawiki/page/title')
    Maintenant une page $page est le noeud en contexte et il est bien capable de faire appeler à la méthode findnodes(). Mais, le xpath est encore absolu. Par conséquence, la retourne est de quatre termes, encore des pages de titre (page1, page2, page3, page4), au lieu de un comme intention. Au final, ça fait un produit cartésien 4x4=16 termes dans @tab_file. Ce n'est pas l'intention de l'exercice.

    Les mêmes choses pour la deuxième partie. Si on instruit de faire >>:utf8 au lieu de >:utf8, on verra voir text4 soit toujours la dernière sortie, donc, en apparence, on écrit toujours text4 et c'est une faute impression.

    Il faut remplacer les xpath absolus par ceux qui sont relatifs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #foreach my $title ($page->findnodes('/mediawiki/page/title')) {
    foreach my $title ($page->findnodes('title')) {
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #foreach my $rev ($page->findnodes('/mediawiki/page/revision')) {
    foreach my $rev ($page->findnodes('revision')) {
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ceci est la seule qui est bonne {
    foreach my $text ($rev->findnodes('text/text()')) {
    Et il y a une petite erreur de frappe $text au lieu de $texte pour print, mais ce est la moindre de chose.
    Voilà !

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/01/2011, 15h57
  2. [xml/perl] quel module ?
    Par Lockless dans le forum Modules
    Réponses: 5
    Dernier message: 28/06/2006, 17h31
  3. Réponses: 5
    Dernier message: 25/07/2005, 10h17

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