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 :

Lenteur de XML::XPath ?


Sujet :

Modules Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2002
    Messages : 28
    Points : 27
    Points
    27
    Par défaut Lenteur de XML::XPath ?
    salut,

    J'ai un script qui utilise XML::XPath et je trouve ce script particulièrement lent !
    Il ne réalise pourtant que 5 requêtes XPath sur un fichier XML qui ne pèse que 50 ko environ...

    Est-ce qu'il serait de notoriété publique que XML::XPath soit un module lent ou bien ai-je codé avec les pieds ?

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Sans ton code de script et ton fichier XML, on va pas pouvoir te répondre aisément. J'utilise fréquemment XPath et je n'ai jamais rencontré ce problème de lenteur.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2002
    Messages : 28
    Points : 27
    Points
    27
    Par défaut
    Je posterai le code ce soir alors parce que je ne l'ai pas sous la main ici...

    (promis j'utiliserai la balise [ code ][ /code ] )

    J'utilise fréquemment XPath et je n'ai jamais rencontré ce problème de lenteur
    Ceci dit il est tout à fait possible que j'ai codé avec les pieds...

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2002
    Messages : 28
    Points : 27
    Points
    27
    Par défaut
    Bon, je passe la seconde alors... Je vous explique ce que je fais, ensuite je vous donne le code que j'ai fait avec mes doigts de pieds

    Il s'agit de parser un fichier XML issu d'une extension de Firefox : Bookmark synchroniser. Cette extension permet d'exporter les bookmarks de firefox sur un serveur distant et ce au format XBEL (XML Bookmark Exchange Language). il suffit ensuite d'avoir l'extension sur toutes les machines où vous avez une session et vos bookmarks sont toujours à jour.

    Du coup, je dispose sur mon serveur du fichier xml en question. Li'dée est que lorsque je surfe depuis une machine qui ne m'appartient pas, je puisse accéder à mes bookmarks quand même. Pour ça il me suffit de parser le fichier XML et d'afficher ça en html.

    J'ai donc fait ce script en Perl avec le module XML::XPath :

    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    #!/usr/bin/perl -w
     
    use XML::XPath;
    use XML::XPath::XMLParser;
    use strict;
     
    my $prefix = "rdf\%3A\#\$";
     
    print "Content-type: text/html\n\n";
    my $FolderId = $ENV{'QUERY_STRING'};
     
    if($FolderId eq "") {
      TraiteXBEL("");
    }
    else {
      TraiteXBEL($FolderId);
    }
     
    exit(0);
     
    sub TraiteXBEL {
      # usage: TraiteXBEL($InputFolderId);
      #
      # * SI $FolderId est defini ALORS on liste les dossiers et les liens dans le dossier correspondant ;
      # * SI $FolderId est vide ALORS on liste les dossiers et les liens à la racine.
     
      my ($InputFolderId) = @_;
     
      my $XPATH_REQUEST1;
      my $XPATH_REQUEST2;
      my $XPATH_REQUEST3;
      my $XPATH_REQUEST4;
      my $XPATH_REQUEST5;
     
      my $XBEL = XML::XPath->new('./xbel.xml'); 
     
      if($InputFolderId eq "") {
        $XPATH_REQUEST1='/xbel/folder/@id';
      }
      else {
        $InputFolderId = $prefix.$InputFolderId;
        $XPATH_REQUEST1='//folder[@id=\''.$InputFolderId.'\']/folder/@id';
      }
     
      my $nodeset = $XBEL->find($XPATH_REQUEST1);
     
      my $NbFolders = $nodeset->size();
      print "<h2>Rubriques ($NbFolders)</h2>\n";
     
      foreach my $node ( $nodeset->get_nodelist ) {
     
          my $FolderId = XML::XPath::XMLParser::as_string( $node );
          $FolderId =~ s/[ ]+?id="(.*?)"/$1/g;
     
    	# On extrait le suffixe du $FolderId pour eviter les caracteres speciaux.
    	my $suffix = substr($FolderId,8);
     
          # liste des dossiers
          $XPATH_REQUEST2='//folder[@id=\''.$prefix.$suffix.'\']/title/text()';
          my $FolderName = $XBEL->find($XPATH_REQUEST2);
     
          print "<ul>";
          my $nom = XML::XPath::XMLParser::as_string( $FolderName->get_nodelist );
          print "<li><a href=\"./xbel.cgi?$suffix\">$nom</a></li>\n";
          print "</ul>";
      }
     
      # liste des liens
      if($InputFolderId eq "") {
        $XPATH_REQUEST3='/xbel/bookmark/@id';
      }
      else {
        $XPATH_REQUEST3='//folder[@id=\''.$InputFolderId.'\']/bookmark/@id';
      }
     
      $nodeset = $XBEL->find($XPATH_REQUEST3); # on rï¿œupï¿œe tous les attr: id
     
      my $NbLiens = $nodeset->size();
      print "<h2>Marque-pages ($NbLiens)</h2>\n";
     
      foreach my $node ( $nodeset->get_nodelist ) {
     
          my $BookmarkId = XML::XPath::XMLParser::as_string( $node );
          $BookmarkId =~ s/[ ]+?id="(.*?)"/$1/g;
     
          # liste des bookmarks
     
          $XPATH_REQUEST4='//bookmark[@id=\''.$BookmarkId.'\']/title/text()';
          my $BookmarkTitles = $XBEL->find($XPATH_REQUEST4);
          my $BookmarkTitle = XML::XPath::XMLParser::as_string( $BookmarkTitles->get_nodelist );
     
          $XPATH_REQUEST5='//bookmark[@id=\''.$BookmarkId.'\']/@href';
          my $BookmarkUrls = $XBEL->find($XPATH_REQUEST5);
          my $BookmarkUrl = XML::XPath::XMLParser::as_string( $BookmarkUrls->get_nodelist );
          $BookmarkUrl =~ s/[ ]+?href="(.*?)"/$1/g;
     
          print "<a href=\"$BookmarkUrl\">$BookmarkTitle</a><br />\n";
      }
    }
    il y a deux cas de figure :
    • [li]le script reçoit un id en argument par l'url (méthode GET)[/li]
      [li]ou pas[/li]


    Si aucun argument n'est passé par l'url, alors on affiche la liste des dossiers (balise folder) grâce à leur attribut id. ainsi que la liste des bookmarks à la racine. Si un id est passé en argument, alors, on fait la même démarche mais en partant du dossier correspondant.

    Voila...

  5. #5
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2002
    Messages : 28
    Points : 27
    Points
    27
    Par défaut
    Il semble que ça vienne de la lourdeur des requetes XPath, en tout cas, celles qui commencent par //

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2002
    Messages : 28
    Points : 27
    Points
    27
    Par défaut
    Je confirme, car en reformulant les requêtes de façon plus optimisées, c'est nettement plus rapide... 8)

Discussions similaires

  1. [VB6] xml xpath alléger syntaxe
    Par totoche dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 28/11/2006, 16h01
  2. [xml] Xpath besoin d'explication sur preceding-sibling::
    Par ekmule dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 10/01/2006, 09h32
  3. [XML-XPATH] Problème dans un for each
    Par stailer dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 26/12/2005, 12h11
  4. XML / Xpath -> une solution avec Builder?
    Par say dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/05/2005, 11h56

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