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

Web Perl Discussion :

[CGI] Formulaire qui génére un fichier XML


Sujet :

Web Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Par défaut [CGI] Formulaire qui génére un fichier XML
    Bonjour à tous,

    J'ai besoin d'aide car je débute dans la programmation Perl/CGI avec du XML.
    Je dois faire un formulaire en CGI qui lorsqu'il est remplit, génére un fichier XML avec les données saisies. Deuxième étape, je dois faire le contraire, c'est-à-dire de parser le fichier XML générer pour restituer les infos.
    Pour l'instant, je suis bloqué à la première partie :

    J'ai mon fichier ajourform.cgi

    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
     
    #!C:/Perl/bin/perl.exe
     
    print "Content-type: text/html\n\n";
     
    print "<html>";
    print "<head>";
    print "<title>Ajout d'un serveur</title>";
    print "</head>";
    print "<body>";
    print "<form name=\"monform\" action=\"/cgi-bin/Projet/scripts/ajout.cgi\" method=\"post\">";
    print "<center><font face=\"Tahoma\" size=\"3\"><u><b>Ajout d'un serveur</b></u></font></center>";
    print "<br>";
    print "<font face=\"Tahoma\" size=\"2\">";
    print "Nom du serveur* : <input type=\"text\" name=\"name\" size=\"10\" value=\"\"><br>";
    print "Nom du catalogue* : <input type=\"text\" name=\"catalog\" size=\"10\" value=\"\">";
    print "</font>";
    print "<br><br><hr><br>";
    print "<font face=\"Tahoma\" size=\"2\"><u>Pools :</u></font><br><br>";
    print "<input type=\"hidden\" name=\"pools\" value=\"pool\">";
     
    print "<table>";
    print "<tr><td colspan=\"6\" align=\"center\"><font face=\"Tahoma\" size=\"2\"><b>Quotidienne</b></font><input type=\"hidden\" name=\"quotidienne\" value=\"daily\"></td></tr>";
    print "<tr>";
    $size = 30;
    $cpt = 0;
    for ($i=1; $i<=$size; $i++) {
     print "<td align=\"right\"><font face=\"Tahoma\" size=\"2\">$i.</font></td>";
     print "<td><input type=\"text\" name=\"quot$i\" size=\"7\" value=\"\"></td>";
     $cpt++;
     if ($i == $size) {
      print "</tr>";
     } elsif ($cpt == 3) {
      print "</tr><tr>";
      $cpt = 0;
     }
    }
    print "</table>";
     
    print "<br><br>";
    print "<input type=\"submit\" value=\"OK\">";
    print "</form>";
    print "</body>";
    print "</html>";
    puis mon fichier ajout.cgi qui est le script qui permet de générer le fichier XML en récupérant les données saisies :

    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
     
    #!C:/Perl/bin/perl.exe
     
    use CGI;
    use strict;
     
    # Création de l'objet CGI
    my $query = new CGI;
     
    print $query->header;
    print $query->start_html(-title => 'Réponse');
    print $query->h2('OK');
     
    # Ecriture du fichier XML
    open(FICXML, ">>serveurs.xml") or die("Le fichier serveurs.xml ne peut être édité !\n");
    # Si le fichier serveurs.xml est vide, on insère l'en-tête d'un fichier XML
    if (-z FICXML) {
     print FICXML "<?xml version=\"1.0\"?>\n";
     print FICXML "<tinaBackup>\n";
    }
     
    print FICXML "<host>\n";
     
    foreach ($query->param) {
     print FICXML "<$_>".$query->param($_)."</$_>\n";
    }
     
    print FICXML "</host>\n";
    print FICXML "</tinaBackup>\n";
     
    # Fermeture du fichier XML
    close(FICXML);
     
    print $query->end_html;
    Mon problème est le suivant, le fichier générer en XML ne correspond pas à ce que j'attends. Voici le résultat :

    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
     
    <?xml version="1.0"?>
    <tinaBackup>
    <host>
    <name>freo056s</name>
    <catalog>cat_freo056s</catalog>
    <pools>pool</pools>
    <quotidienne>daily</quotidienne>
    <quot1>AJ1212L1</quot1>
    <quot2>AJ1212L1</quot2>
    <quot3></quot3>
    <quot4></quot4>
    <quot5></quot5>
    <quot6></quot6>
    <quot7></quot7>
    <quot8></quot8>
    <quot9></quot9>
    <quot10></quot10>
    <quot11></quot11>
    <quot12></quot12>
    <quot13></quot13>
    <quot14></quot14>
    <quot15></quot15>
    <quot16></quot16>
    <quot17></quot17>
    <quot18></quot18>
    <quot19></quot19>
    <quot20></quot20>
    <quot21></quot21>
    <quot22></quot22>
    <quot23></quot23>
    <quot24></quot24>
    <quot25></quot25>
    <quot26></quot26>
    <quot27></quot27>
    <quot28></quot28>
    <quot29></quot29>
    <quot30></quot30>
    </host>
    </tinaBackup>
    alors que j'attends un résultat de ce type pour que ma DTD soit correcte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0"?>
    <tinaBackup>
    <host>
    <name>freo056s</name>
    <catalog>cat_freo056s</catalog>
    <pool>
    <daily>
    <quot1>AJ1245L1</quot1>
    <quot2>AJ5689L1</quot2>
    </daily>
    etc...
    </host>
    </tinaBackup>
    Le problème vient de la boucle qui prend séquentiellement tous les résultats. Comment faire pour qu'elle s'arrete pour faire des "cascades" ? J'ai fais des tests avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($query->param('pools') == "pool") {...}
    Mais chaque fois la condition est vraie...

    Merci.

    Henri

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par henri_kuy
    Le problème vient de la boucle qui prend séquentiellement tous les résultats. Comment faire pour qu'elle s'arrete pour faire des "cascades" ? J'ai fais des tests avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($query->param('pools') == "pool") {...}
    Mais chaque fois la condition est vraie...
    C'est parce que tu ne compares pas avec le bon opérateur : "==" est l'opérateur de comparaison numérique, "eq" est l'opérateur pour les strings. Les opérateurs numériques et pour les chaînes de caractères sont séparés parce qu'en Perl les opérateurs imposent un contexte aux opérandes et les variables ne s'évaluent pas de la même façon en contexte numérique qu'en contexte de chaîne de caractères (par exemple "+@array" donne le nombre d'éléments dans @array et ""@array"" donne une liste des éléments de @array séparés par un espace).

    Par ailleurs si tu rajoutais "use warnings;" au début de ton script, tu serais prévenu de ce genre de petites erreurs.

    Encore une chose :
    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
     
    print <<END;
    Content-type: text/html\n\n
     
    <html>
    <head>
      <title>Ajout d'un serveur</title>
    </head>
    <body>
    <form name="monform" action="/cgi-bin/Projet/scripts/ajout.cgi" method="post">
    <center>
      <font face="Tahoma" size="3">
        <u><b>Ajout d'un Serveur</b></u>
      </font>
    </center>
    <br>
    END
    Je n'ai pas tout transformé, mais j'espère que tu vois à quel point c'est plus propre, lisible et facile à taper ! Attention, les variables ne sont pas interpolées, sauf si tu met "<<"END"" au lieu de "<<END".

    --
    Jedaï

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Par défaut
    Merci beaucoup pour ton aide Jedai

    Grâce à tes explications, j'ai pu avancer et avoir le résultat que je voulais avoir pour le fichier généré en XML. Le problème était bien entre "==" et "eq".

    Merci également pour tes conseils, il est vrai que le code est beaucoup plus lisible et plus facile à taper ainsi. J'avais vu cette méthode dans certains scripts et un moment, j'ai eu une erreur et je n'avais pas trop compris où était le problème. C'est pour cela que j'ai codé à la bonne vieille méthode, au moins j'étais sur que cela fonctionné

    Par contre, j'aimerai avoir vos avis sur ma méthode de codage. Je trouve que mon code est beaucoup trop statique. Si jamais il y a des améliorations futures à apporter, modifier le code serait un peu rébarbatif...
    C'est à ce niveau que ça me gêne dans le fichier ajout.cgi :

    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
     
    # Ecriture du fichier XML
    open(FICXML, ">>serveurs.xml") or die("Le fichier serveurs.xml ne peut être édité !\n");
    # Si le fichier serveurs.xml est vide, on insère l'en-tête d'un fichier XML
    if (-z FICXML) {
     print FICXML "<?xml version=\"1.0\"?>\n";
     print FICXML "<tinaBackup>\n";
    }
     
    print FICXML "<host>\n";
     
    my $size = 30;
    my $cpt = 0;
    foreach my $element (@listChamps) {
     if ($element eq "pools") {
      print FICXML "<".$query->param($element).">\n";
     } elsif ($element eq "quotidienne") {
      print FICXML "<".$query->param($element).">\n";
      $cpt = 0;
     } else {
      print FICXML "<$element>".$query->param($element)."</$element>\n";
      $cpt++;
      if ($cpt == 30) {
       print FICXML "</daily>\n";
       $cpt = 0;
      }
     }
    }
     
    print FICXML "</pool>\n";
    print FICXML "</host>\n";
    print FICXML "</tinaBackup>\n";
     
    # Fermeture du fichier XML
    close(FICXML);
    Il y a pleins de tests mais d'un côté je ne vois pas comment je pourrais m'en passer... Connaissez-vous des API qui font ce que je veux faire ? Je ne pense pas être assez qualifié pour en écrire un dynamique avec la gestion des "niveaux" de balises XML.

    Henri

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Je ne vois pas du tout l'utilité des paramètres cachés "quotidien" et "pools", ils ne semblent pas avoir le moindre intérêt dans l'état actuel des choses. Je les supprimerais carrément, et j'utiliserais sans doute un module comme XML::Writer pour écrire le XML.

    Ca donnerai quelque chose comme ça :
    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
     
    #!C:/Perl/bin/perl.exe
     
    use CGI;
    use strict;
    use XML::Writer;
     
    # Création de l'objet CGI
    my $query = new CGI;
     
    print $query->header,
           $query->start_html(-title => 'Réponse'),
           $query->h2('OK');
     
    # Ouverture du fichier XML
    open my $xml_file, '>', 'serveurs.xml'
        or die "Le fichier serveurs.xml ne peut être édité : $!\n";
     
    my $xml = new XML::Writer(OUTPUT => $xml_file, DATA_MODE => 1);
     
    $xml->xmlDecl();
    $xml->startTag('tinaBackup');
    $xml->startTag('host');
     
    $xml->startTag('pool');
    $xml->startTag('daily');
     
    foreach ($query->param) {
        $xml->dataElement('$_', $query->param($_)) if $query->param($_);
    }
     
    $xml->endTag('daily');
    $xml->endTag('pool');
     
    $xml->endTag('host');
    $xml->endTag('tinaBackup');
     
    # Fermeture du fichier XML
    $xml->end();
    close( $xml_file );
     
    print $query->end_html;
    Je ne comprend pas très bien non plus ce que tu fais si le fichier existe déjà ? A priori ton approche actuelle résulte en du XML non valide.

    --
    Jedaï

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Par défaut
    Pour les champs cachés, c'est vrai qu'ils ne servent pas à grand chose. Je pensais faire proprement la génération du fichier XML dans ajout.cgi au niveau de la boucle, de ne pas écrire en dur "<pool>", "<daily>", ...

    XML::Writer à l'air pas mal, je n'osais pas trop l'utilser car cela fait plusieurs fois que je recommence mon code
    Je vais faire un test, ça à l'air plus propre.

    Concernant le test du fichier s'il existe déjà, je souhaite réécrire à la suite du fichier XML à chaque fois qu'on remplit le formulaire. Cela me permettais que ce tag

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     print FICXML "<?xml version=\"1.0\"?>\n";
    ne s'écrive qu'une seule fois.

    C'est bien ce que j'ai peur en faisant du XML non valide. Etant étudiant en apprentissage, je dois faire pour mon projet de fin d'année, un petit outil qui permet de faciliter l'insertion et la consultation des stratégies de sauvegardes. Cependant, je n'ai aucune notion en Perl/CGI, ni en XML. J'ai toujours développé en PHP avec une base MySQL et la façon dont je construis mon fichier XML, je pense comme lorsque je modélise un schéma relationnel en gros.

    Henri

  6. #6
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    L'invalidité du xml produit avec ton approche vient du fait que l'élément document (tinaBackup) est refermé plusieurs fois, dans ce cas, peut-être serait-il intéressant d'utiliser plutôt une approche DOM. Quel serait le résultat de plusieurs exécutions successive pour toi ?

    Pour les champs cachés, c'est vrai qu'ils ne servent pas à grand chose. Je pensais faire proprement la génération du fichier XML dans ajout.cgi au niveau de la boucle, de ne pas écrire en dur "<pool>", "<daily>", ...
    Le problème c'est que pour l'instant on ne voit pas comment ces champs pourraient varier, et ce que ça apporterait (tu veux mettre autre chose que "daily" dans quotidien ?), d'autant que le code ne s'adapterait pas bien à l'ajout d'autres champs cachés... Il me semble que la structure de la requête et du XML généré demandrait à être repensée pour permettre plus de dynamisme (mais comme je n'ai aucune idée du but final...)

    --
    Jedaï

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Servlet qui génère un fichier XML: titre du document
    Par LoLoBix dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 15/11/2010, 09h39
  2. Web Service qui génère un Fichier XML
    Par Amir83 dans le forum Services Web
    Réponses: 8
    Dernier message: 29/05/2008, 13h32
  3. [SAX] Génére un fichier XML avec SAX à partir d'un tableau de données
    Par flethiel dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 25/09/2007, 12h12
  4. applet qui appelle un fichier xml
    Par osara dans le forum Applets
    Réponses: 1
    Dernier message: 17/10/2006, 23h44
  5. [HTML] Formulaire HTML vers un fichier XML
    Par Badaboumpanpan dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 24/05/2006, 23h26

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