[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:
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:
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:
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:
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:
if ($query->param('pools') == "pool") {...}
Mais chaque fois la condition est vraie... :(
Merci.
Henri