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
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
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>";
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 #!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;
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
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>
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
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>
Mais chaque fois la condition est vraie...
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ($query->param('pools') == "pool") {...}
Merci.
Henri
Partager