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

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    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 éminent
    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
    Points : 8 586
    Points
    8 586
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    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 éminent
    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
    Points : 8 586
    Points
    8 586
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    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 éminent
    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
    Points : 8 586
    Points
    8 586
    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ï

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Quel serait le résultat de plusieurs exécutions successive pour toi ?
    Ce qui se répète, c'est ce qu'il y a entre les balises "<host></host>" car il y a plusieurs serveurs dont chacuns ont leurs stratégies de sauvegardes.
    Ce qui donne au final un fichier XML de ce genre (à mon sens) :

    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
    <?xml version="1.0"?>
    <tinaBackup>
    <host>
    <name>freo056s</name>
    <catalog>cat_freo056s</catalog>
    <pool>
    <daily>
    <quot1>AJ1245L1</quot1>
    <quot2>AJ5689L1</quot2>
    </daily>
    <weekly>
    <h1>
    <hebd11>AJ2356L1</hebd11>
    <hebd12>AJ1478L1</hebd12>
    </h1>
    <h2>
    <hebd21>AJ8521L1</hebd21>
    <hebd22>AJ0210L1</hebd22>
    </h2>
    <h3>
    <hebd31>AJ6589L1</hebd31>
    <hebd32>AJ0001L1</hebd32>
    </h3>
    <h4>
    <hebd41>AJ5555L1</hebd41>
    <hebd42>AJ5210L1</hebd42>
    </h4>
    <h5>
    <hebd51>AJ7896L1</hebd51>
    <hebd52>AJ6987L1</hebd52>
    </h5>
    </weekly>
    <monthly>
    <m1>
    <mens11>AJ1020L1</mens11>
    <mens12>AJ0314L1</mens12>
    </m1>
    <m2>
    <mens21>AJ9632L1</mens21>
    <mens22>AJ4102L1</mens22>
    </m2>
    <m3>
    <mens31>AJ5541L1</mens31>
    <mens32>AJ4413L1</mens32>
    </m3>
    </monthly>
    <annually>
    <year1>AJ1548L1</year1>
    <year2>AJ1948L1</year2>
    </annually>
    <manually>
    <test1>AJ4613L1</test1>
    <test2>AJ0274L1</test2>
    </manually>
    <spare>
    <spare1>AJ4652L1</spare1>
    <spare2>AJ2580L1</spare2>
    </spare>
    </pool>
    <calendar>
    <year>2006</year>
    <weeks>
    <w1>H1</w1>
    <w2>H2</w2>
    <w3>H3</w3>
    <w4>H4</w4>
    <w5>H5</w5>
    </weeks>
    </calendar>
    <comments></comments>
    </host>
    <host>
    <name>freo080s</name>
    <catalog>cat_freo080s</catalog>
    <pool>
    <daily>
    <quot1>AJ1201L1</quot1>
    <quot2>AJ1235L1</quot2>
    </daily>
    <weekly>
    <h1>
    <hebd11>AJ1515L1</hebd11>
    <hebd12>AJ1526L1</hebd12>
    </h1>
    <h2>
    <hebd21>AJ8495L1</hebd21>
    <hebd22>AJ3265L1</hebd22>
    </h2>
    <h3>
    <hebd31>AJ7894L1</hebd31>
    <hebd32>AJ8415L1</hebd32>
    </h3>
    <h4>
    <hebd41>AJ8412L1</hebd41>
    <hebd42>AJ8411L1</hebd42>
    </h4>
    <h5>
    <hebd51>AJ8451L1</hebd51>
    <hebd52>AJ2595L1</hebd52>
    </h5>
    </weekly>
    <monthly>
    <m1>
    <mens11>AJ4815L1</mens11>
    <mens12>AJ9632L1</mens12>
    </m1>
    <m2>
    <mens21>AJ4815L1</mens21>
    <mens22>AJ1202L1</mens22>
    </m2>
    <m3>
    <mens31>AJ1548L1</mens31>
    <mens32>AJ4859L1</mens32>
    </m3>
    </monthly>
    <annually>
    <year1>AJ1502L1</year1>
    <year2>AJ3625L1</year2>
    </annually>
    <manually>
    <test1>AJ4859L1</test1>
    <test2>AJ3625L1</test2>
    </manually>
    <spare>
    <spare1>AJ0214L1</spare1>
    <spare2>AJ9635L1</spare2>
    </spare>
    </pool>
    <calendar>
    <year>2006</year>
    <weeks>
    <w1>H1</w1>
    <w2>H2</w2>
    <w3>H3</w3>
    <w4>H4</w4>
    <w5>H5</w5>
    </weeks>
    </calendar>
    <comments></comments>
    </host>
    </tinaBackup>
    Il n'est pas complet. Par exemple au niveau du calendrier, il devrait avoir les 52 semaines de l'année. Je me suis arrêté à 5 semaines pour l'exemple etc...

    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...
    Je pense que pour l'instant ça n'apporte rien. Je ne comptais pas les faire variés.

    En gros pour le projet, c'est qu'actuellement je saisis tout manuellement sous Excel. Pour le partage, la création d'une nouvelle stratégie d'un serveur, la consultation, la mise-à-jour, ce n'est pas terrible. Donc dans l'outil que je veux développer, il y a un formulaire pour saisir un nouveau serveur avec sa stratégie (d'où les champs name, catalog, daily pour les bandes quotidiennes - nombre indéterminé, weekly pour les hebdomadaires divisés en 5, monthly pour les mensuelles aussi divisés en 5, annually pour les annuelles, manually pour les bandes de tests, spare pour les bandes vierges et un calendrier pour savoir quel pool de bandes à insérer cette semaine avec éventuellement un champs commentaire).
    Ensuite pour la consultation, je pense qu'il faut que je parse le fichier XML pour resortir les données saisies. Et pour la MAJ, c'est les 2.

    Henri

  8. #8
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Ok, voilà qui est bien plus complexe... En-dehors du fait que je pense que ce format XML n'est peut-être pas idéal (j'ai même l'impression qu'il est assez horrible), la question de la génération du XML change complètement : tu ne peux pas te contenter de XML::Writer si tu veux modifier ce fichier à chaque fois, il vaut mieux utiliser un module comme XML::Twig, capable de parser un fichier XML, d'effectuer des modifications locales sous forme d'insertion d'objet représentant les noeuds et de ressortir le résultat.

    --
    Jedaï

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    OK merci du conseil. Je laisse donc tomber XML::Writer...
    Par contre, j'ai jeté un coup d'oeil sur XML::Twig et il est assez difficile à comprendre. Je vois beaucoup de parsing sur un fichier XML mais pas de création et d'écriture.
    A ton avis, le projet est-il possible à réaliser ? Je n'arrive pas à voir assez loin et il me reste 1 mois et demi pour le terminer...
    Je vais faire quelques recherches sur XML::Twig lol
    Merci encore.

    Henri

  10. #10
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Pour XML::Twig, regarde le tutorial sur ce site. Si le fichier est vide, contente toi d'écrire la base de ton document XML (juste la déclaration XML et l'élément document), puis applique ta modification normale après. En 1 mois et 1/2 c'est très finissable, mais tout dépend d'à quelle vitesse tu progresses et de l'ampleur de ce que tu as à faire et que tu ne nous as pas dit.

    --
    Jedaï

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Merci pour le site, j'y suis actuellement. Je travail tous les jours sur ce projet mais il est vrai que j'ai du mal à progresser...
    Normalement, je vous ai tout dis. S'il y a des améliorations à apporter, ce n'est pas trop grave. Il faut que j'ai un minimum à présenter.

    A bientôt, dans de nouvelles aventures

    Henri

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    En gros, j'utilise XML::Writer pour générer mon fichier XML au début (s'il est vide ou s'il n'existe pas).
    Pour la suite, la consultation et la modification, je prends XML::Twig ?
    Car dans ce dernier, je vois qu'il y a toujours cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $twig->parsefile('serveurs.xml');
    On parse toujours un fichier mais je ne vois pas de méthode pour la création
    Merci d'avance.

    Henri

  13. #13
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    XML::Writer n'est peut-être pas nécessaire, un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if( -z $file_name ){
        open my $file, '>', $file_name
            or die "$!\n";
        print {$file} <<EOXML;
    <?xml version="1.0"?>
    <tinaBackup>
    </tinaBackup>
    EOXML
    }
     
    # procédure normale
    Devrait suffire... (Le principal intérêt d'XML::Writer c'est qu'il vérifie la validité du XML émis et qu'il convertit automatiquement les caractères comme ">" dans les éléments texte, ici ça ne sert vraiment à rien !)

    --
    Jedaï

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    XML::Writer n'est peut-être pas nécessaire, un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( -z $file_name ){ open my $file, '>', $file_name or die "$!\n"; print {$file} <<EOXML; <?xml version="1.0"?> <tinaBackup> </tinaBackup> EOXML } # procédure normale
    Devrait suffire...
    Effectivement, je n'ai plus la tête en dehors de l'eau là lol
    Avec toutes les informations que j'ai obtenu, je réfléchie même plus

    En tout cas j'avance doucement mais surement. Il parse très bien XML::Twig
    Merci encore pour ton aide.

    A+

    Henri

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Juste une question pour la démarche de la procédure normale.
    Si mon fichier XML (serveurs.xml) existe déjà, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0"?>
    <tinaBackup>
    <host name="freo056s" catalog="cat_freo056s">
    ...
    </host>
    <host name="freo080s" catalog="cat_freo080s">
    ...
    </host>
    </tinaBackup>
    Pour insérer un nouveau host entre </host> et </tinaBackup>, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0"?>
    <tinaBackup>
    <host name="freo056s" catalog="cat_freo056s">
    ...
    </host>
    <host name="freo080s" catalog="cat_freo080s">
    ...
    </host>
    <host name="freo092s" catalog="cat_freo092s">
    ...
    </host>
    </tinaBackup>
    Je dois parcourir jusqu'à cet endroit pour l'insérer ou parser tout le fichier XML et réécrire le tout dans un nouveau fichier avec le nouveau host à ajouter ?
    Existe t-il une "commande" pour arriver directement à la fin du fichier ? Comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $root = $twig->root;
    Merci d'avance.

    Henri

+ 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, 10h39
  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, 14h32
  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, 13h12
  4. applet qui appelle un fichier xml
    Par osara dans le forum Applets
    Réponses: 1
    Dernier message: 18/10/2006, 00h44
  5. [HTML] Formulaire HTML vers un fichier XML
    Par Badaboumpanpan dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 25/05/2006, 00h26

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