Solutions des exercices pour le cours
"TECHNOLOGIE INTERNET"
gilles.hunault@univ-angers.fr
Table des matières
cours 1 pages web, formulaires niveau 1
cours 2 "headers", formulaires niveau 2, scripts cgi
cours 3 pages web et javascript
cours 4 applets java, niveau élémentaire
cours 5 intégration de html et php
cours 6 langage mysql et accès aux bases mysql via php
cours 7 html, xhtml et xml
Cours 1 : pages web, formulaires niveau 1 (énoncé)
Voir le code-source de la page principale du cours. Ce n'est bien sur pas la seule solution. Au lieu d'un tableau, on aurait pu utiliser une liste numérotée ou des sections disposées cote à cote. L'indentation fait ressortir les éléments et facilite une vérification humaine qu'il ne manque pas de balise.
On peut utiliser weblint (disponible en ligne de commande sous Forge) ou http://validator.w3.org/ sur le web, il y a aussi [CSE] Html validator, Max's Html beauty ou n'importe quel éditeur orienté HTML. Le plugin Htmlvalidator cité dans le cours peut aussi servir.
Une fois le DOCTYPE changé dans index.htm, on détecte 6 erreurs :
line 20 column 17 - Erreur: there is no attribute "background" line 34 column 9 - Erreur: there is no attribute "align" line 66 column 48 - Erreur: document type does not allow element "a" here; missing one of "p", "h1", "h2"... line 67 column 6 - Erreur: character data is not allowed here line 68 column 12 - Erreur: there is no attribute "color" line 68 column 21 - Erreur: element "font" undefinedVoir le code-source de la page index_strict.htm pour voir comment on a corrigé ces erreurs.
Afficher le code-source de la page tableau Ok (commentaires en fin de fichier).
De même, les pages tableau.htm et tableau2.htm montrent comment réaliser les deux autres tableaux en "transitonnel". Les solutions "strictes" sont nommés tableau_strict.htm et tableau2_strict.htm.
On peut utiliser checkbot ou Web Link Validator (payant) ou Xenu (gratuit). Le plugin Linkchecker cité dans le cours peut aussi servir.
Voici les symboles affcihés (consulter la source) : € £ Å ¶ Ø
On gère ces symboles via des entités dont une liste possible est à l'adresse : w3schools.
Pour faire vite il est judicieux d'avoir un modèle ou maquette ou skelette de page avec une commande exécutable pour charger un fichier du répertoire courant. Voici un exemple de squelette : skel.htm ; voici la commande d'appel de ce squelette pour mozilla avec son chemin d'accès complet :
mozilla file:///home/gh/public_html/internet/skel.htm & On définit bien sur un alias en deux ou trois lettres pour cette commande.
Consulter formulair.htm (version minimale) et boform.htm (version propre et valide XHTML).
SOURCE XHTML : boform.txt ; on remarquera que les styles s'appliquent aussi aux champs et même aux items de liste dans la liste de sélection des jours, que le nom "prénom" est utilisé deux fois (interdit en strict), que pour abonné, on n'a pas défini de valeur (le navigateur transmet "on"), etc.
Pour voir les styles en action, afficher la source de la page n_p1.htm ; une discussion plus fine est dans le document ti2005.pdf.
Pour justifier, utiliser le fichier std.css.
Le texte écrit par Microsoft Word est plus long, plus lourd, avec plein de "metas".
- le fichier courage.alamain contient une version minimale.
- le fichier courage.word97 contient le code HTML produit par Word 97.
- le fichier courage.word2002 contient le code HTML produit par Word 2002.
- le fichier courage.rtfstd contient le code RTF produit par Word 97.
- le fichier courage.rtfste contient le même code RTF en plus lisible.
(enfin, à peu près ; regarder de plus près la fin du fichier).Voici des références par ordre de complexité croissante pour HTML
- ccim
- ungi et peut-être dmc
- laltruiste
- http://fr.selfhtml.org/
En ce qui concerne les différences entre les navigateurs IE et Netscape, on peut consulter
http://developpeur.journaldunet.com/tutoriel/dht/020911_dom.shtml Pour les gens pressés, la "css_cheat_sheet" donne en anglais et en une page tout ce dont il faut se rappeler sur les styles. Version pdf : ici. Pour d'autres "refcards", cliquer là.
Maxthon est plus paramétrable que IE. Voir le site officiel.
Pour windows, lire http://www.ccim.be/ccim328/html/choix.htm : pour Linux, quanta et eclipse sont des choix "techniques mais raisonnables".
Il y a malheureusement une "pléthore" de logiciels, comme vous pourrez vous en rendre compte en feuilletant les liens suivants :
http://www.gratuiciel.com/freeware/pc/d0.htm
http://www.philgate.com/phil_Web/editeur.html
http://guide.ungi.net/htmledit.htmSi on se focalise sur les éditeurs prévus aussi pour php, ce n'est pas plus simple : regardez
http://cyberzoide.developpez.com/php4/editeurs Et si on s'intéresse aussi à XML, ce n'est pas mieux, comme le montre les liens :
http://xmlsoftware.com/editors.html
http://developpeur.journaldunet.com/tutoriel/out/050530-panorama-editeurs-xml.shtml
http://web.ccr.jussieu.fr/urfist/XML.htmDap (Download Accelerator Professional) est un outil de rapatriement en parallèle pour augmenter le rapatriement de fichiers sur Internet. Wget est un outils Dos, Windows et Unix pour rapatrier des pages webs, des sites complets... Pour un fichier MHT, il suffit de faire "Enregistrer sous..." avec IE. Lynx est un navigateur non graphique.
La balise pre permet de conserver les espaces et les retours chariots. La balise xmp (interdite en XHTML) recopie tel quel. La balise kbd utilise une police non proportionnelle. Avec le texte suivant
[ligne 1] . Bonjour (retour charriot) [ligne 2] . Et <font size="+3"><b>au</b></font> revoir !on obtient en mode pre
. Bonjour . Et au revoir !alors qu'on obtenait en mode xmp
. Bonjour . Et <font size="+3"><b>au</b></font> revoir !et en mode kbd
. Bonjour . Et au revoir ! UTF8 et ISO8859 sont des encodages de caractères et de fichiers. Lire le détail dans http://www.afnic.fr/noncvs/formations/unicode_long/index.pdf (copie locale ici). Au passage, qu'est-ce que l'AFNIC ?
On ne peut pas extraire directement le n-ième caractère d'une chaine codée en Unicode car certains caractères au sens classique plusieurs autres caractères dits "combinatoire" comme le c-cédille.
Pour convertir, utiliser recode sous Unix ou iconv.
Pour voir facilement les couleurs, on peut utiliser colorpicker.
Il faut mettre dans target le mot _blank comme par exemple
<a href="xmp.htm" target="_blank">xmp.htm</a>Consulter xmp_xhtml.htm ; les règles à respecter sont ici.
Une discussion plus fine est dans le document ti2005.pdf.
Après avoir consulté google_form qui contient une copie restructurée
du formulaire de Google (datant d'octobre 2007), on voit clairement l'URL
de base à utiliser, soit http://www.google.fr/search ainsi que le nom q
du champ d'entrée et le paramètre caché meta à utiliser avec sa valeur
cd=countryFR pour restreindre à la France.Vérification : ici. A propos, connaissez-vous le site soople ?
Un "bon développement Web" repose sur quelques règles simples :
Toujours écrire des documents xhtml valides, pour la grammaire transitionnelle d'abord et pour la grammaire stricte si on en a le temps.
Pour les formulaires, mettre au point en mode GET puis passer en mode POST quand tout est au point.
Mettre, partout là où c'est possible, des liens relatifs.
Utiliser des feuilles de styles pas trop compliquées et vérifier le rendu sous IE et sous Firefox.
Mettre des icones pour prouver que la page est valide et penser à vérifier et à faire vérifier l'orthographe par d'autres.
Cette question n'a aucun sens. Meilleur par rapport à quoi ? Sans critère de jugement, tous les navigateurs se valent : IE parce qu'il est le plus répandu, Firefox parce qu'il est le plus configurable etc.
Les tests ACID ont pour but de vérifier à quel point les navigateurs se conforment au W3C. En mai 2009, seul le navigateur Safari arrive à passer le test Acid3 à 100 %. Voir le test Acid3.
Cours 2 : "headers", formulaires niveau 2, scripts cgi (énoncé)
Afficher la source des pages diaporamas.htm, diapoa.htm et diapoa2.htm.
Un exemple plus complet avec mise à jour de 2 frames simultanément (via l'affichage d'une liste de fichiers lus dans un fichier liste [!]) est disponible ici.
Consulter ncbi.htm.
Voici quelques références
texte détaillé http://www.htmlhelp.com/fr/faq/html/forms.html perl/ssi http://fr.selfhtml.org/cgiperl/introduction/traitementformulaire.htm php http://www.manuelphp.com/php/language.variables.external.form.php javascript (1) http://www.toutjavascript.com/savoir/savoir06_2.php3 javascript (2) http://xlbysteph.free.fr/javascript/forms/formmasque.htm javascript (3) http://www.toulouse-renaissance.net/c_outils/c_formcol.htm formulaires et java http://www.univ-lemans.fr/enseignements/physique/02/java/java5.html
Il faut commencer par tester le script en local, sans instruction HTML, c'est à dire écrire un programme "normal". Une fois qu'il est au point, il faut rajouter les instructions pour mettre du code HTML autour des affichages du programme. On peut alors effectuer une redirection de la sortie du programme vers un fichier HTML avant de tester avec le navigateur grace à la commande Fichier/Ouvrir
Enchainement des commandes à réaliser pour un script Perl :
emacs monprog.pl # édition perl monprog.pl # exécution perl monprog.pl > monprog.htm # redirection netscape file:///home/info/.../monprog.htm # visualisationEnchainement des commandes à réaliser pour un script Rexx :
sedit monprog.rex # édition rexx monprog.rex # exécution rexx monprog.rex > monprog.htm # redirection netscape file:///home/info/.../monprog.htm # visualisation
Vous n'êtes pas autorisé à écrire dans /scripts !
Vous n'êtes pas autorisé à écrire dans /scripts ! La solution aurait été : compte.sh ; la source est ici
Consulter images.sht et miniimages.zip; pour bien comprendre le script, on pourra exécuter les commandes en détail à la main les unes à la suite des autres en utilisant des fichiers intermédiaires.
On pourra consulter duree.pl qui fonctionne en ligne de commande.
Consulter exemple.php dont la source est ici ; on pourra noter que tout utilisateur sans droit particulier peut utiliser php. Par contre pour l'interpréter, il faut passer par le protocole http:// même si on écrit la page en local.
Vous n'êtes pas autorisé à écrire dans /scripts !
Voir la solution de l'exercice numéro 3 pour la partie 1 du cours Sac/Farcompr.
Voir le code-source de menuinternet.htm qui pour une fois n'est pas du xhtml mais du HTML valide ; la feuille de style utilisée est nommée menu.css et on remarquera que le menu reste fixé à gauche de la page avec Firefox et Opera, mais qu'il disparait sous IE7.
Sans utiliser javascript, il est possible de faire des "choses propres" avec CSS, mais en acceptant de charger des pages différentes. Voir le code-source de google2009/firefox2.html par exemple.
Voir le code-source et la feuille de style de menu.htm.
Beaucoup de choses : son adresse IP, son système d'exploitation, sa résolution écran, son fournisseur etc.
Voir la démonstration sur le site de la CNIL.
Couplé à une géolocalisation, ce genre de technique permet d'obtenir un "flicage" digne d'un film :
Cours 3 : pages web et javascript (énoncé)
Voir le fichier nombres.htm dont la source est ici.
Javascript doit servir à une gestion dynamique éventuelle de la page. Il vaut mieux créer des objets et insérer du contenu via DOM ; window.document.write ne devrait servir qu'en entrainement à la programmation en javascript pour éviter des appels fastidieux et répétitifs à la fonction alert.
Voir la solution approximative formulairejs.htm dont la source est ici. Une solution propre est formulairejsok.htm
De même qu'il y a la balise <SCRIPT> il existe la balise <NOSCRIPT>. Voir le fichier testjs.htm dont la source est ici. (penser à vérifier que vous savez désactiver javascript pour voir les deux affichages).
S'il s'agit juste de charger par URL une page différente en fonction de l'activation de javascript, il n'y a pas besoin de passer par <SCRIPT> et <NOSCRIPT> car javascript peut "intercepter" l'URL (voir plus bas).
La notion de version de javascript n'a aucun sens et ne serait pas très utile, vu que les différents navigateurs implémentent des langages javascript différents. Une détection des propriétés du javascript sous-jacent au navigateur est beaucoup plus "fonctionnelle".
Cela dépend du navigateur. Au vu de l'URL javascript: Firefox ouvre une fenêtre de debug qui montre seulement les erreurs de javascript.
L'erreur est d'avoir mis l'apostrophe telle quelle ce qui ferme trop tot l'instruction write. Pour afficher une "quote", il faut mettre \ devant l'apostrophe.Le texte correct est donc :
window.document.write(' Qui le dit ? C\'est moi ! ') ; ****A l'affichage, l'instruction write incorrecte est simplement ignorée : il est difficile de se rendre compte qu'il manque quelquechose. Il est donc conseillé d'utiliser javascript: avec Firefox pour tester les scripts écrits en javascript (lorsque cela focntionne). Une solution "propre" consiste à utiliser Firebug dont une version "lite" existe même pour Internet Explorer.
Voici quelques références :
- javascriptindex
- selfhtml
- Introduction à Javascript en français
- Tout javascript !
- listes de ressources Javascript
- liste de guides de référence
- javascript Guide JS 1.5
En particulier jalix est une bonne référence pour comprendre la différence entre java et javascript en termes d'objets et savoir13 montre bien la hiérarchie des objets liée à une page Web avec ses deux pages détail_1 et détail_2 Ce site fournit aussi un index interactif.
Ecmascript est un langage de programmation équivalent à javascript mais qui fonctionne en dehors des navigateurs Web. FESI est un interpréteur javascript/ecmascript pour Windows, pour Unix. On peut aussi utiliser spidermonkey(l'exécutable se nomme js), rhino, see (Simple ECMAscript Engine)...
Voici quelques éditeurs et environnements considérés comme "les meilleurs" : (en 2004)
Vérifiez que la page solution est bien capable de modifier le contenu de 2 cadres à la fois puis consultez les sources des pages utilisées...
Une lecture attentive des pages et un bon entrainement à la programmation permettent de comprendre les scripts...
Voir ti2005.pdf pour la fonction ecritSite().
Pour la fonction dd, voir dd.js. Ecrire dd("bonjour") est beaucoup plus court que d'écrire window.document.write('<dd>+"bonjour"+'</dd>') ; c'est aussi plus lisible, et cela garantit que les balises sont bien ouvertes et fermées.
La syntaxe correcte est <script type='text/javascript' src='fic.js'></script> pour le chargement des fonctions du fichier fic.js> et <script type='text/javascript'>f(a,b,c...)</script> pour l'appel de la fonction f avec les paramètres a, b>, c... Sinon on peut utiliser du CDATA mais c'est "mauvais"...
Voir validejs.htm avec en particulier son style valpers.css et son script valpers.js
Le script ne voit aucune valeur parce qu'il n'y pas de nom (attribut name) dans le formulaire. L'attribut id sert au DOM/navigateur du document et est accessible par javascript alors que name permet au serveur d'accéder aux variables renvoyées. On pourra aussi consulter batraciens pour les changements de style dynamiques.
Avec type='texte' le type est incorrect ; le navigateur ignore donc type et met type='text' par défaut ; avec type='_submit_' pareil, mais ce coup-là ce n'est pas ce qu'on voulait. action='#' correspond à l'adresse du fichier du formulaire, mais avec une indication de section vide. Le navigateur exécute l'action donc il recharge la page et remet la valeur par défaut. Nombre est différent de nombre en javascript. Il y a donc erreur et javascript s'arrete avant de passer sur return false.
Pour une création dynamique, voir jscreadyn.htm. Pour les puristes de la création dynamique, voir jscreadyn2.htm.
Consulter tableau2sol.htm. Il suffit de charger sorttable.js dans l'élément head puis d'ajouter class='sortable' à l'élément table pour qu'on puisse trier les colonnes. Ce qui est dommage, c'est qu'il faille ajouter un style pour qu'on remarque que le tableau puisse être trié. On pourra consulter la page de l'auteur du code-source en javascript. Par contre, on ne peut pas trier les lignes.
Cours 4 : applets java, niveau élémentaire (énoncé)
Pour tester une applet hors navigateur, on peut utiliser le programme appletviewer. qui est en principe installé en standard avec le jdk ou le jre utilisé pour compiler le programme java.
Vous pouvez utiliser les pages suivantes
Applet minimale nbm1 (divers affichages d'un texte) source de la page nbm1 ; source des applets. Applet nbm2 qui affiche un nombre aléatoire source de la page nbm2 ; source de l'applet. Applet nbm3 qui demande un nombre et utilise un bouton source de la page nbm3 ; source des applets. Applet complète nbm source de la page nbm ; source de l'applet.
Il existe de nombreuses références. Laquelle choisir est une affaire de gout. Je conseillerais :
- la documentation en ligne de Java chez Sun
- le site penser en java avec textes anglais et français en regard
- le "java corner" suisse (et en français)et aussi, cités sur la page du cours :
- des exemples de mini-applets pour tout faire
- les applets : petit cours par Isabelle Thieblemont
- les applets : cours de l'Université du Mans
Là encore, il y a de nombreux environnements.
Celui nommé BlueJ, gratuit et en français qui correspond au livre Conception objet en Java avec BlueJ me semble être un bon choix. Pour plus de détails, voir le livre de Barnes / Kolling chez l'éditeur Pearson. Téléchargement de bluej (anglais) et tutoriel (français).
L'environnement netbeans de Sun vaut aussi le détour.
Tout d'abord, il faut repérer où javascript est utilisé.
Une lecture attentive du formulaire permet de voir que javascript est utilisé 3 fois, à chaque clic proposé pour les boutons du formulaire soit les instructions :
onclick="document.cpt.setCouleur('bleu')"> onclick="document.cpt.setCouleur('rouge')"> onclick="resuapplet.value=document.cpt.getCompteur()">Dans les deux premiers cas, on communique directement avec l'applet alors que dans le troisième cas, on met comme valeur dans le champ texte du formulaire le résultat de l'exécution de la fonction java nommé getCompteur.
Cours 5 : intégration de html et php (énoncé)
Il faut utiliser la fonction phpversion ; pour plus de détail sur la version de php utilisée, il existe une fonction phpinfo, soit l'instruction <? phpinfo() ?>. Test ici et là.
Source de la page ; on remarquera qu'on n'écrit même pas <HTML><HEAD>...Lorsque l'installation le permet (par exemple avec PHP sous Linux comme pour forge) PHP peut s'utiliser en ligne de commande. Cela permet de tester les scripts sans passer par les formulaires, de mettre au point des objets, des sous-programmes... On peut alors utiliser PHP comme un interpréteur classique. Les paramètres passés sont alors dans le tableau nommé (comme d'habitude !) $argv.
Un autre intérêt des options de PHP en ligne de commande (consultables ici sous Linux et là pour Windows) est de vérifier la syntaxe du texte PHP ; avec un navigateur, souvent la page est vide en cas d'erreur ; en ligne de commande on a des messages explicites comme :
PHP Parse error: unexpected '>' in /home/info/gh/public_html/internet/test.php on line 222 PHP Parse error: parse error, unexpected T_ECHO, expecting ',' or ';' in /home/info/gh/public_html/internet/validation.php on line 647En ligne de commande, il y a passage à la ligne à chaque \n, comme pour le code-source de la page Web. Dans la page Web, seuls les balises comme <br />, <p>, <tr>... passent à la ligne. Remarque : il n'y a donc aucun rapport entre les numéros de lignes du programme php et les numéros de lignes de la page affichée. La page principale du formulaire de Google par exemple (soit source) contient un code-source qui n'a presque pas de retour à la ligne lisble...
Les retours à la ligne dans une page Web sont obtenus par les éléments p, br, hr, les tr des tableaux et les divisions, ou par style CSS. Les retours à la ligne dans le source viennent des "\n" écrits par PHP.
On met dans cet ordre l'URL puis les paramètres puis la section. Ainsi on doit écrire http://deneb.info-ua/~gh/internet/solutions.php?ref=1628#php.
Fichiers solutions à consulter :
demandenb1.php Formulaire sans validation source validenb1.php Validation sans vérification source demandenb2.php Formulaire avec validation source validenb2.php Validation avec vérification source La solution a déja été donnée en 4.
L'intérêt, c'est de rester au niveau des fonctions php et de fermer systématiquement les balises. De plus il est plus court d'écrire h1("Bonjour") ; que echo "<h1>Bonjour</h1>\n" ;\n et c'est aussi plus lisible.Voici deux définitions de h1 donc une seule est "propre" :
function h1($chen=" ") { echo "<h1> $chen </h1>\n" ; } ; # fin de fonction h1 function h1($chen) { echo "<h1>$chen</h1>" ; } ; # fin de fonction h1Il serait tout aussi "conceptuel" et "développeur" de regrouper les fonctions h1($txt) et h2($txt) en une seule fonction h paramètrée telle que h1($txt) corresponde à h(1,$txt) et h2($txt) à h(2,$txt) à condition de n'utiliser que les fonctions h1() et h2().
Si on compare les solutions validenb1.php, validenb2.php et validenb3.php il est clair que la troisième est la plus courte à lire...
Les fonctionnalités évidentes correspondent à la saisie et au stockage du nom, du prénom, de la date et de l'heure de soutenance.
Après quelques essais, on se rend compte qu'il n'est pas possible d'utiliser le même couple (date/heure) pour des personnes différentes et que si on rentre la même personne la date et l'heure sont changées pour cette personne. En d'autres termes, une même personne ne peut pas réserver plusieurs créneaux.
Une fonctionnalité cachée est la possibilité de réinitialiser la base des horaires de soutenance via un couple (nom/prenom) bien choisi mais que pour des raisons de sécurité on ne donnera pas ici (démonstration en salle).
Ces fonctionnalités ne sont pas obligatoires mais choisies. Plus généralement, un programme PHP doit correspondre à des spécifications, à un CdCF (cahier des charges fonctionnnel), implémentant la solution décidée parmi toutes celles possibles. Ici, on pourrait autoriser la prise de plusieurs rendez-vous pour la même personne, imposer un mot de passe, envoyer un mail de confirmation, verrouiller les rendez-vous à une date fixe, relancer ceux qui n'ont pas pris rendez-vous etc.
PhpMyAdmin est une application écrite en PHP qui permet d'administrer, depuis un navigateur,des bases de données de type MySQL (une version PostgreSQL est aussi disponible) via une interface de type tableur. On peut également créer, modifier, supprimer des bases de données ou des tables, exécuter des requêtes SQL, exporter et importer des fichiers texte pour remplir les tables.
Pour plus de renseignements, consulter :http://www.phpmyadmin.net/ En voici une copie d'écran (cliquer pour aggrandir) :
PhpMyAdmin est pour MySql. Il y a bien sur phpPgAdmin pour PostgreSQL.
Il faut extraire les initiales de la variable $ldi et produire le texte :
<select name="num_med"> <option value="1"> JD </option> <option value="2"> EV </option> <option value="3"> HP </option> </select>On peut réaliser cela avec les instructions php suivantes :
$ldi = "JD EV HP" ; $tdi = split(" ",$ldi) ; # = preg_split("/\s+/",(trim($ldi))) ; si espaces multiples $num = 0 ; echo "Choisissez l'initiale du médecin " ; echo "<select name='num_med'>\n" ; foreach ($tdi as $initiales) { $num++ ; echo "<option value=\"$num\"> $initiales </option>\n" ; } ; # fin pour chaque echo "</select>\n" ;Vous pouvez consulter le code-source de la solution et son affichage.Références en français :
documentation http://www.nexen.net/ http://www.manuelphp.com/ http://php.net/ formulaires http://www.phpindex.com/ bases de données http://laurent.fagot.free.fr/ éditeur http://cyberzoide.developpez.com/php4/editeurs/ La dernière référence de l'exercice précédent, à savoir :
http://cyberzoide.developpez.com/php4/editeurs/
peut suffire comme réponse.
La fonction include permet de lire un autre fichier PHP ; on s'en sert classiquement pour lire des sous-programmes communs. Démonstration
appel.php programme appelant source sousprog.php sous programme appelé (on voit rien au chargement) source On notera que les deux scripts PHP ne contiennent aucune instruction HTML.
On peut bien sur lire des fichiers en PHP. A titre d'exemple :
litfic.php script de lecture source brut.txt fichier texte lu lignes numérotées En ligne de commande, c'est vous qui êtes propriétaire des fichiers écrits. Par contre sur le Web, c'est le serveur, d'où des précautions d'écriture...
Remarque : Une page Web est un fichier, accessible par son URL. On peut donc ouvrir n'importe quelle page Web via fopen en PHP.
Pour écrire au lieu de lire, il faut changer le deuxième paramètre de fopen. Attention toutefois à ce que le répertoire doit être en écriture pour le groupe 'others', soit le chmod 777, ce qui n'est pas conseillé.
Par contre, il est toujours possible d'écrire dans le répertoire dit 'temporaire' du système (sans doute /tmp sous Linux). La fonction tempnam sert alors à rendre unique le nom du fichier pour le programme. Consulter tmpnam.php et sa source pour voir un exemple.
Trouver la liste des fonctions consiste simplement à chercher 'function' comme premier mot de la ligne. Voir listefns.php comme exemple de solution. On pourra aussi utiliser ldphp.pl (et son module strFuncs.pm) dont un exemple de sortie est ldphp.sortie.
Une session sert à conserver les valeurs des variables PHP à travers plusieurs pages. Si la page 1 initialise "bêtement" la variable a avec la valeur 1 et appele la page 2 alors cette page 2 ne connait pas la variable a. Par contre si la page 3 initialise dans une session la variable a avec la valeur 1 et appele la page 4 alors la page 4 connait la variable a.
Fichiers à consulter :
php_ses1.php page 1 "bête" qui initialise a sans session source php_ses2.php page 2 "bête" appelée sans session : a est inconnu source php_ses3.php page 3 initialisation de a avec session source php_ses4.php page 4 appelée avec session source Pour savoir si une variable est définie, on peut utiliser la fonction isset. Consulter la source de php_ses2.php pour voir son utilisation.
Pour conserver un tableau ou un objet, il faut utiliser serialize(). En voici un exemple : serialize.php
Pour faire un histogramme de pourcentages, une seule instruction suffit si on a tout préparé. Ainsi l'histogramme demandé correspond à l'URL http://www.info.univ-angers.fr/pub/gh/jphistopct.php ?vdata=8_94_5_3_35&xmrks=gp_info_mkg_rh_stat&titr=REPARTITION%20DES%20CATEGORIES%20DE%20STAGES
Vous pouvez cliquer sur le lien précédent et modifier les paramètres pour voir dynamiquement le graphique évoluer. Mon script jphistopct est basé sur jpgraph.
Un fichier PHP pour définir le début d'une page Web en une ligne est gen.php.
Voir le code-source de php_conceptuel1.php puis le code-source de php_conceptuel2.php pour des utilisations des fonctions proposées. Pour la deuxième partie de l'exercice, consulter conceptuel4.php.
Une traduction possible de codon2aa.pl est codons2aa.php. Si on l'applique au fichier mystere.txt on trouve PAPAMIMI en ligne 1 et MAMA en ligne 2.
Le fichier mygoogle.pl est une solution possible. Pour l'appel de google en ligne de commande, regardez goog.rex
Pour php, une solution est mygoogle.txt vérifiable ici.
Consulter personnes.php vérifiable ici.
Selon ses auteurs, Artichow est une librairie qui permet de créer simplement des graphiques avec PHP et GD. Consulter www.artichow.org et features pour en savoir plus.
print_r signifie "print readable", le r signifie donc "lisible". Cela permet d'afficher la structure et le contenu d'un tableau, d'un objet. Exemple : printr.php
Il est bien sur tout à fait possible d'écrire du Javascript via php. Voir par exemple phpjs.
Voir litdbf. Le seul problème est l'extension Dbase de PHP doit etre activée...
Avec require si le fichier n'est pas vu, le script est arrété. Avec require_once idem, sauf que si le fichier existe et qu'il a déja été chargé, on ne recharge pas. Avec include si le fichier n'existe pas, on le dit mais on ne s'arrete pas. Avec include_once idem sauf que si le fichier existe et qu'il a déja été chargé, on ne recharge pas. Rappel : quelle que soit la technique d'include, il n'est pas autorisé de redéfinir une fonction. Donc si la fonction essai est définie dans le fichier test1.php et dans le fichier test2.php, mettre include('test1.php') ; include('test2.php') ; provoquera de toutes façons une erreur.
ERROR_REPORTING permet de définir l'affichage des erreurs. Voir par exemple la page associée sur www.manuelphp.com ; ainsi en ligne de commande, avec error_reporting(E_ALL | E_STRICT | E_NOTICE ) ; $b = $a + 1 ; on obtient le message d'erreur "Notice: Undefined variable: a in erreurs.php on line 11.
Cela doit sans doute provenir du serveur qui "balance" automatiquement un mauvais "Content-type". La solution en php consiste à forcer le "content-type" via la fonction header comme dans le fichier forceiso.php dont le code-source est ici. Sans php et sans toucher au serveur, il doit être possible de paramètrer le fichier htaccess pour associer un 'charset' à un type de fichier, par exemple utf pour .htm, iso pour .html mais attention aux effets de bord !
Il faut utiliser la fonction show_source comme par exemple ici.
Voir les pages demandeUniprot.php et reponseUniprot.php dont le code-source est ici et là.
Transformations XSL utilisées : uniprot1.xsl et uniprot2.xsl sous-programme php : ; reponseUniprotFns.
La conclusion est que les expressions régulières sont plus puissantes que les fonctions de base sur les chaines de caractères mais que le transformation xsl est, au final, la plus concise et la plus facile à relire, à maintenir, meme si ce n'est pas toujours simple de la mettre au point.
Pour le passage d'un identifiant à l'autre, voir la page demande_bioinfo_id.php et reponse_bioinfo_id.php dont le code-source est ici et là.
Pour bien gérer les conversions d'identifiant, il faut se ramener au gi du NCBI car de nombreux sites savent l'utiliser.
La classe tdm est définie à la fin du fichier std.php.
Cours 6 : langage mysql et accès aux bases mysql via php (énoncé)
Pour obtenir les options de la ligne de commande, on tape mysql --help. Sous Unix, on peut également taper man mysql.
Avec mysql --help on obtient un texte comme celui-ci sous Linux ou comme celui-ci sous Windows avec EasyPhp alors qu'avec man mysql on obtient un texte comme celui-là.
L'option -E affiche tous les résultats en mode vertical, avec une indication de ligne de résultat.
Par exemple là ou en mode normal, une commande select affiche
+------+------+-----+------+------+------+------+ | NUM | SEXE | AGE | PROF | ETUD | REGI | USAG | +------+------+-----+------+------+------+------+ | M001 | 1 | 62 | 1 | 2 | 2 | 3 | | M002 | 0 | 60 | 9 | 3 | 4 | 1 | +------+------+-----+------+------+------+------+ 2 rows in set (0.00 sec)le mode -E affiche*************************** 1. row ******* NUM: M001 SEXE: 1 AGE: 62 PROF: 1 ETUD: 2 REGI: 2 USAG: 3 *************************** 2. row ******* NUM: M002 SEXE: 0 AGE: 60 PROF: 9 ETUD: 3 REGI: 4 USAG: 1 2 rows in set (0.00 sec)L'intérêt du mode -E réside dans le fait qu'un programme informatique peut plus facilement traiter les informations affichées. De plus, s'il y a beaucoup de champs(colonnes) alors on voit tout à l'écran sans problème de ligne découpée...
L'option -v affiche plus de détails qu'en mode normal et en particulier avec -v -v -v on obtient le rappel de l'instruction sql et une sortie bien formatée qu'on peut utiliser directement en impression.
Une fois sous mysql, on peut taper select version() ; pour avoir le numéro de version ; l'aide s'obtient avec help ; pour avoir la date et l'heure, on écrit respectivement select curdate() ; et select curtime() ; .
Il est très simple d'interfacer perl et mysql car perl dispose d'un module DBI qui interface toutes les implémentations classiques des bases de données dont mySQL ; lire le fichier perl_mysql.pdf pour plus d'informations. Vous pouvez lire ici un exemple de fichier perl qui utilise DBI.
Pour exécuter une liste de commandes SQL mises dans un fichier, on peut soit utiliser la redirection d'entrée soit (à partir de la version 4.) utiliser la commande source dont le raccourci est \. Ainsi pour le fichier prog.mysql on peut soit écrire
mysql < prog.mysqlsoit charger mysql puis tapersource prog.mysqlou\. prog.mysql
Consulter la fin du tuteur MySql.
Il faut transférer la structure et les données via mysqldump puis tout réinsérer sur le portable, soit par exemple pour la table elf :
mysqldump ... test.elf > elf.mysql # [sur forge] export vers fichier texte # transfert sur le portable via ftp ou sftp de elf.mysql mysql ... < elf.mysql # [sur le portable] importAttention, sur le portable, il faudra sans doute écriremysql_connnect("localhost","root","")au lieu demysql_connnect("forge","anonymous","anonymous")La commande mysqldump fournit le code-source pour la recréation de la table et du remplissage avec les données, soit ici : elf.mysql.Voir le fichier combien.php dont l'exécution est ici.
Consulter ronfle30a39 pour la source ; l'url ronfle30a39.php en fournit l'exécution. On pourra comparer avec ronflemieux.php dont l'exécution est ici.
Il faut bien sur utiliser SQL pour les tris. SQL est prévu et donc optimisé pour cela. De plus avec PHP, on accède aux résultats par tableau. Un tri multicritères est donc compliqué à écrire en PHP, mais pas en SQL.
Voici une solution possible (non conceptuelle) : (code-source complet ; éxécution)
$nc1 = "idmedecin" ; $nc2 = "med_initiales" ; $que = "select $nc1, $nc2 from medecins order by $nc1 " ; $res = mysql_query($que) ; echo "<select name='num_med'>\n" ; while ($ldr=mysql_fetch_array($res)) { $num = $ldr[$nc1] ; $ini = $ldr[$nc2] ; echo "<option value=\"$num\"> $ini </option>\n" ; } ; # fin de tant que echo "</select>" ;Remarque : on peut aussi considérer qu'il s'agit de la partie "amont" de l'exercice sur les initiales de médecin (énoncé ici). Auquel cas on peut se contenter de remplir correctement la variable $ldi, soit le code suivant pour remplacer la boucle tant_que précédente :$ldi = "" ; while ($ldr=mysql_fetch_array($res)) { $ldi .= " ".$ldr[$nc1]." " ; } ; # fin de tant que
A l'aide de show databases, show tables et describe, tout est possible !
Voici un formulaire qui le prouve : f_dscbaz.php qui utilise comme action dscbaz.php dont le code-source est ici sachant qu'on utilise aussi le programme listebases.php et le programme listetables.php. Le code-source du formulaire, non conceptuel (snif !) est là.
Vous pouvez récupérer une archive de ces programmes.
Le site officiel http://www.mysql.com contient tout ce qu'il faut comme documentation.
Pour une carte de référence rapide, on peut lire php4ref.pdf qui provient du site
http://www.digilife.be/quickreferences/quickrefs.htm Pour une documentation en français, nous rappelons qu'il faut utiliser les documents du site
http://www.nexen.net/docs/mysql/
et en particulier la version en ligne annotée :http://www.nexen.net/docs/mysql/annotee/manuel_tocd.php
Voici le texte du formulaire f_sout.txt et son exploitation via envoisout.txt : on a mis XXX, YYY, ZZZ etc. en nom et place des vrais noms de table, base... de même, le mot de passe pour la remise à zéro de la base n'est pas celui actuellement utilisé ; envoisout.txt est un "vieux" texte, non concetuel à réécrire via montresourcephp.php?nomfic=std.php...
Il suffit de rajouter target="_blank" dans la balise <form> Ce "target" peut aussi être utilisé avec href. Attention : en XHTML, c'est interdit !
Voir tplongprogs.zip et aussi tplong/ pour une démonstration des programmes dont la liste des services et la liste du personnel.
Consulter categstages.php dont le code source lisible est ici.
Voir histo.php dont le code-source est ici qui utilise histos.php.
Cours 7 : html, xhtml et xml (énoncé)
Cette question n'aucun sens. On peut discuter de document "bien formé" dans l'absolu (balises ouvertes bien fermées, par exemple) mais pour parler de validité, il faut indiquer par rapport à quelle grammaire.Pour la grammaire transitionnelle, le fragment de code est valide. Pour XHTML strict, il n'est pas valide car il mélange le fond et la forme : l'attribut background est donc interdit. On peut utiliser au choix soit un style à la volée comme : <body style='background-image:url(beige.jpg)'> mais un "bon" concepteur préferera un style mis dans un fichier css, soit par exemple : <body class='fond_beige'> où fond_beige est par exemple défini par body.fond_beige { background-image:url("beige.jpg") }.
Le document xmp.htm s'affiche correctement avec un navigateur comme Netscape ou Internet Explorer. Toutefois, il contient de petites erreurs. Voici par exemple ce que dit weblint :
ligne 5 The HTML spec. recommends the TITLE be no longer than 64 characters. ligne 18 : empty container element <P>. ligne 23 : value for attribute HREF (http://www.info.univ-angers.fr/pub/gh/) of element A should be quoted (i.e. HREF="http://www.info.univ-angers.fr/pub/gh/") ligne 23 : IMG does not have ALT text defined. ligne 29 : empty container element <P>.Commençons par gérer les petites erreurs sans conséquence.
L'erreur en ligne 5 peut se corriger en raccourcissant le titre au texte "Page à tester".
On peut sans doute supprimer les balises <P> des lignes 18 et 29 pour ne plus avoir de paragraphes vides.
Au niveau de la ligne 23, il faut impérativement ajouter des guillemets pour référencer l'URL ; pour l'image, on peut indiquer en mode ALT qu'il s'agit du retour à la page principale soit finalement le texte correct : consulter xmp2.htm dont la source est xmp2_htm.txt
Si maintenant on se préoccupe de HTML 4 et de XHTML, à l'aide du site
http://validator.w3.org/ on voit apparaitre une erreur grave : il n'y a pas de balise DOCTYPE comme première balise. Si on met
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">comme nouvelle première ligne du document, alors le document est valide pour la spécification "HTML 4.01 Transitional". On pourra le vérifier en essayant de vérifier l'URL
http://www.info.univ-angers.fr/pub/gh/internet/xmp3.htmPar contre si on veut un "vrai" document XHTML Strict, alors il reste du travail à faire comme on peut s'en rendre compte en vérifiant l'URL
http://www.info.univ-angers.fr/pub/gh/internet/xmp4.htmEnfin, il est clair que xmp.htm n'est pas un document XHTML car sinon comme tout document XML, il commencerait par
<xml...Et ce n'est pas non plus un document XML car de nombreuses balises ne sont pas fermées, comme par exemple les <p>. De plus les "entités" comme et à ne sont pas définies, pas plus que le codage (qui est sans doute ici ISO-8859 comme pour tout "bon français qui se respecte"). A ce propos, signalons qu'il est certainement peu cohérent de coder avec des accents comme dans "pensé" et de coder avec des entités comme dans "après". On consultera donc xmp4.htm comme document valide en XML/XHTMl Strict.
Les options de la commande rxp sont obtenues par rxp --help à savoir :
usage: rxp [-abemnNsStvVx] [-o b|0|1|2|3] [-c encoding] [-u base_uri] [url]Vous pouvez consulter ici la page de manuel correspondante. Pour n'afficher que les erreurs, on utilise -s comme silent et pour valider on utilise -V (à ne pas confondre avec -v comme verbose).
Si on tape xmllint sans option, on voit la liste des options à savoir :
Usage : xmllint [options] XMLfiles ... Parse the XML files and output the result of the parsing --version : display the version of the XML library used --debug : dump a debug tree of the in-memory document --shell : run a navigating shell --debugent : debug the entities defined in the document --copy : used to test the internal copy implementation --recover : output what was parsable on broken XML documents --noent : substitute entity references by their value --noout : don't output the result tree --nonet : refuse to fetch DTDs or entities over network --htmlout : output results as HTML --nowrap : do not put HTML doc wrapper --valid : validate the document in addition to std well-formed check --postvalid : do a posteriori validation, i.e after parsing --dtdvalid URL : do a posteriori validation against a given DTD --dtdvalidfpi FPI : same but name the DTD with a Public Identifier --timing : print some timings --output file or -o file: save to a given file --repeat : repeat 100 times, for timing or profiling --insert : ad-hoc test for valid insertions --compress : turn on gzip compression of output --html : use the HTML parser --xmlout : force to use the XML serializer when using --html --push : use the push mode of the parser --memory : parse from memory --nowarning : do not emit warnings from parser/validator --noblanks : drop (ignorable?) blanks spaces --nocdata : replace cdata section with text nodes --format : reformat/reindent the input --encode encoding : output in the given encoding --dropdtd : remove the DOCTYPE of the input docs --nsclean : remove redundant namespace declarations --testIO : test user I/O support --catalogs : use SGML catalogs from otherwise XML Catalogs starting from file:///etc/xml/catalog are activated by default --nocatalogs: deactivate all catalogs --auto : generate a small doc on the fly --xinclude : do XInclude processing --loaddtd : fetch external DTD --dtdattr : loaddtd + populate the tree with inherited attributes --stream : use the streaming interface to process very large files --walker : create a reader and walk though the resulting doc --pattern pattern_value : test the pattern support --chkregister : verify the node registration code --relaxng schema : do RelaxNG validation against the schema --schema schema : do validation against the WXS schema Libxml project home page: http://xmlsoft.org/ To report bugs or get some help check: http://xmlsoft.org/bugs.htmlUne page de manuel pour xmllint est ici.Pour n'afficher que les erreurs, rien à faire, c'est ce qui se passe par défaut.Par contre pour ne pas voir le texte, il faut utiliser l'option --noout et pour valider, il faut utiliser l'option --valid.
Le fichier elfdix.xml est bien formé ; on peut le vérifier en tapant
rxp elfdix.xmlou en tapantxmllint elfdix.xmlou même simplement en essayant de le charger dans un navigateur...Par contre savoir s'il est valide est une question qui n'a aucun sens : on doit dire valide par rapport à une grammaire (DTD ou XSD) et aucune grammaire n'est fournie ici.
Le fichier vins.xml n'est pas bien formé car il manque > à la balise LIGNEDATA de la ligne 10 (CHMP soit champagne). Si on rajoute > alors le fichier est bien formé.
Malheureusement même une fois corrigé si on lui ajoute
<!DOCTYPE DOSSIER SYSTEM "statdata.dtd">ce fichier n'est pas valide pour la grammaire statdata.dtd ; voici la raison donnée par rxp
rxp -V -s vins_ok.xml Warning: Content model for DSC does not allow it to end here in unnamed entity at line 9 char 7 of file:/vins_ok.xmlet la raison donnée par xmllint
xmllint --noout --valid vins_ok.xml vins_ok.xml:9: element DSC: validity error : Element DSC content does not follow the DTD, expecting (NOM , LDSC , NATURE , DATE), got (NOM LDSC NATURE )ce qui signifie que la balise DSC est incorrecte (car il lui manque pour cette grammaire DTD la balise DATE).Il n'est pas valide non plus pour la grammaire statdata.xsd car si on met comme entête pour le fichier modifié
<DOSSIER xsi:noNamespaceSchemaLocation="statdata.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >alors notre programme perl nommé testevs.pl présenté dans notre tuteur XML renvoie comme erreur :sirius> perl testevs.pl vins.xml statdata.xsd le document nommé vins4xsd.xml n'est pas valide pour son schéma : Inside element 'DOSSIER', element 'DSC' does not match content model '(TITRE,DSC,NOMSCOL,LIGNEDATA+)'.De même, notre programme java nommé testevs.java présenté dans notre tuteur XML renvoie comme erreur :deneb> java testevs vins.xml statdata.xsd Le document n'est pas valide pour le schéma fourni : true cvc-complex-type.2.4.a: Invalid content starting with element 'DSC'. The content must match '(("":TITRE),("":DSC),("":NOMSCOL),("":LIGNEDATA){1-UNBOUNDED})'.ce qui signifie que la balise DSC est incorrecte (car il lui manque pour cette grammaire XSD la balise TITRE).
Si on applique la transformation heros.xsl au fichier XML Films.xml on obtient les titres des films, chaque titre étant mis dans une balise paragraphe (ce qui pour l'instant ne sert à rien).
Voici le texte de la transformation :
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="ISO-8859-1" /> <xsl:template match="/"> <xsl:apply-templates select="//TITRE" /> </xsl:template> <xsl:template match="TITRE"> <p><xsl:value-of select="." /></p> </xsl:template> </xsl:stylesheet>Et le début du fichier des films :
<?xml version="1.0" encoding="ISO-8859-1"?> <FILMS> <FILM Annee='1958'> <TITRE>Vertigo</TITRE> <GENRE>Drame</GENRE><PAYS>USA</PAYS><MES idref="3"></MES> <ROLES> <ROLE><PRENOM>James</PRENOM><NOM>Stewart</NOM> <INTITULE>John Ferguson</INTITULE></ROLE><ROLE><PRENOM>Kim</PRENOM> <NOM>Novak</NOM> <INTITULE>Madeleine Elster</INTITULE></ROLE></ROLES> <RESUME>Scottie Ferguson, ancien inspecteur de police, est sujet au vertige depuis qu'il a vu mourir son collègue. Elster, son ami, le charge de surveiller sa femme, Madeleine, ayant des tendances suicidaires. Amoureux de la jeune femme Scottie ne remarque pas le piège qui se trame autour de lui et dont il va être la victime... </RESUME> </FILM> <FILM Annee='1979'> <TITRE>Alien</TITRE> <GENRE>Science-fiction</GENRE><PAYS>USA</PAYS><MES idref="4"></MES> <ROLES> <ROLE><PRENOM>Sigourney</PRENOM><NOM>Weaver</NOM> <INTITULE>Ripley</INTITULE></ROLE></ROLES> <RESUME>Près d'un vaisseau spatial échoué sur une lointaine planète, des Terriens en mission découvrent de bien étranges "oeufs". Ils en ramènent un à bord, ignorant qu'ils viennent d'introduire parmi eux un huitième passager particulièrement féroce et meurtrier. </RESUME> </FILM> ...Voici le début de l'affichage correspondant à la transformation :
<p>Vertigo</p> <p>Alien</p> <p>Titanic</p> <p>Sacrifice</p> <p>Volte/Face</p> <p>Sleepy Hollow</p> <p>American Beauty</p> <p>Impitoyable</p> ...Si maintenant on utilise la transformation titres.xsl comme feuille de style alors on obtient un vrai document HTML comme titres.xml converti à la volée par le navigateur. Pour utiliser cette feuille de style, il suffit de mettre comme début de document xml :
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/xsl" href="titres.xsl"?> <FILMS> <FILM Annee='1958'> <TITRE>Vertigo</TITRE> <GENRE>Drame</GENRE><PAYS>USA</PAYS><MES idref="3"></MES> <ROLES> ...
On peut écrire de nombreux fichiers XML pour un stage selon que l'on veut utiliser des éléments imbriqués ou des couples (attribut,valeur). Un fichier "purs éléments" ressemblerait à
<stage> <sujet> </sujet> <an> </an> <categorie> </categorie> <stagiaire> <nom> </nom> <prenom> </prenom> <numtel> </numtel> <adr> </adr> <mail> </mail> </stagiaire> <entreprise> <nom> </nom> <mds> </mds> <!-- maitre de stage --> <adr> <rueetc> </rueetc> <codepost> </codepost> <fincp> </fincp> <!-- fin code postal --> </adr> <telent> </telent> <!-- telephone entreprise --> <telmds> </telmds> <!-- telephone mds --> <telfax> </telfax> <!-- numero de fax --> <mailmds> </mailmds> </entreprise> </stage>Un fichier XML qui serait "tous couples (attribut,valeur)" ressemblerait plutot à
<stage sujet="" an="" categorie=""> <stagiaire nom="" prenom="" numtel="" adr="" mail="" /> <entreprise nom="" mds="" adr_rueetc="" adr_codepost="" adr_fincp="" telent="" telmds="" telfax="" mailmds="" /> </stage>Et bien sur des panachés entre ces deux fichiers extrêmes sont possibles. La bonne solution (si tant est qu'il n'y en ait qu'une seule) doit se trouver en regardant ce qu'on veut faire ensuite comme traitements.
Si on exécute en ligne de commande
mysql --xml ... --database statdata < stagesMaitrise.mysql > stagesMaitrise.xmloù stagesMaitrise.mysql contient seulement select * from stagesMaitrise alors mysql produit automatiquement le fichier stagesMaitrise.xml ce qui montre que mysql connait en standard xml... mais pas les accents !
On pourra consulter :
stage1a_xml.txt le stage 1 en xml solution 1 stage1b_xml.txt le stage 1 en xml solution 2 stage2a_xml.txt le stage 2 en xml solution 1 stage2b_xml.txt le stage 2 en xml solution 2 Il est déconseillé d'essayer d'écrire les grammaires DTD et XSD correspondantes à la main car des outils logiciels comme XMLSPY ou des outils en ligne commme la page Web
http://www.hitsw.com/xml_utilites/ le font automatiquement et bien mieux que nous, et qui plus est, sans erreur dans les fichiers-grammaires.
On pourra comparer les grammaires stagea_xmlspy.dtd et stagea_xmlspy.xsd produites par XMLSPY pour le modèle a avec les grammaires stagea_xmlutil.dtd et stagea_xmlutil.xsd crées par la page Web citée pour le modèle a.
De la même façon, on comparera les grammaires stageb_xmlspy.dtd et stageb_xmlspy.xsd produites par XMLSPY pour le modèle b avec les grammaires stageb_xmlutil.dtd et stageb_xmlutil.xsd crées par la page Web citée pour le même modèle.
Pour la liste des stages, on peut par exemple à l'aide d'un programme mettre les fichiers bout à bout à l'intérieur d'une balise <stages> (avec un "s" en fin de balise) soit le fichier
<?xml version="1.0" encoding="ISO-8859-1" ?> <stages> <stage> ... ici le contenu de stage1.xml </stage> <stage> ... ici le contenu de stage2.xml </stage> </stages>Une autre solution, que nous préférons, consiste par programme à définir une entité pour chaque fichier stage et à la nommer dans la balise <stages> (avec un "s" en fin de balise) soit le fichier
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE ENCYCLOPEDIE [ <!ENTITY stg1b SYSTEM "stage1.xml"> <!ENTITY stg2b SYSTEM "stage2.xml"> ]> <stages> &stg1b; &stg2b; </stages>Voir stages.xsl qui contient
Exemple d'utilisation : nbstages.xml (afficher la source pour avoir une surprise !)
Voir extr_stages.php exécutable ici.
La commande xpath permet de tester quels noeuds de l'arbre XML sont obtenus par filtre. On pourra lire par exemple à ce sujet le fameux xpath tutorial.Voici -- non commentées à l'écrit -- les réponses aux questions d'interrogations de noeuds :
xpath -e "//TITRE" films.xml xpath -e "//ROLE/NOM" films.xml xpath -e "//FILMS/FILM[@Annee=1990]/TITRE" films.xml xpath -e "/FILMS/ARTISTE[@id=/FILMS/FILM[TITRE='Alien']/MES/@idref]/ACTNOM films.xmlNous avons "honteusement" pris ces exemples sur la page de Cedric au Cnam :
http://cedric.cnam.fr/vertigo/Cours
Oui, un script php peut appeler un programme perl avec shell_exec si le serveur Web est configuré pour autoriser l'exécution de programmes et si les chemins d'accès (path) sont corrects. Consulter le fichier vers.php et sa source.
Voici un fichier xml2dar.xsl possible :
<?xml version="1.0" encoding="ISO-8859-1"?> <!-- xml2dar.xsl : n'affiche que les données --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="ISO-8859-1" /> <xsl:variable name="sautdeLigne"> <xsl:text> </xsl:text> </xsl:variable> <xsl:template match="/"> <xsl:apply-templates select="//NOMSCOL|//LIGNEDATA" /> </xsl:template> <xsl:template match="NOMSCOL"> <xsl:value-of select="concat(.,$sautdeLigne)" /> </xsl:template> <xsl:template match="LIGNEDATA"> <xsl:value-of select="concat(.,$sautdeLigne)" /> </xsl:template> </xsl:stylesheet>On pourra le comparer à xml2dar2_trim.xsl.On exécute bien sûr cette transformation avec notre programme exsl.java.
A savoir, on écrit en ligne de commande pour l'appliquer au fichier elfdix.xml:deneb> java exsl elfdix.xml xml2dar.xslToutefois, comme il s'agit d'un programme Java, il faut peut-être rajouter un classpath comme par exemple :deneb> java -classpath .:/shared/lib/xalan.jar exsl elfdix.xml xml2dar.xsl
Voici le jeu de piste pour les 12 réponses aux 12 questions :
Source des fichiers utilisés :
countp.xsl lsagents.xsl ltagents.xsl
counts.xsl lsserv.xsl ltserv.xsl
PHP supporte nativement JSON ; voir par exemple http://fr.php.net/json.
Le programme repx.php utilise DOM pour créer le texte XML suivant (formatage adapté à la compréhension) :
<?xml version="1.0"?> <conv> <pouces>-1</pouces> <cm>-1</cm> </conv>
Retour à la page principale de (gH)