Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
td_histoire_numerique:exercice_3 [2015/11/25 08:22] Francesco Beretta [Transformation des textes encodés en XML] |
td_histoire_numerique:exercice_3 [2016/01/04 19:11] Francesco Beretta [Production des données] |
||
---|---|---|---|
Ligne 51: | Ligne 51: | ||
===== Production des données ===== | ===== Production des données ===== | ||
+ | Pour des exemples de production de données, voir les exercices 4 et 5. | ||
\\ | \\ | ||
Ligne 68: | Ligne 68: | ||
* La suite du message contient la suite des erreurs provoquées par cette première erreur: celle-ci corrigée, tout rentre dans l'ordre | * La suite du message contient la suite des erreurs provoquées par cette première erreur: celle-ci corrigée, tout rentre dans l'ordre | ||
- | ===== Requêtes SQL /XPath ===== | + | ===== Requêtes SQL / XPath ===== |
- | Une fois les textes XML-TEI enregistrés dans la base (dans le champs 'texte-tei' des objets correspondants aux textes, un objet par texte) on peut intérroger la base de données et extraire des informations des textes. | + | Une fois les textes transformés en XML avec la fonction indiquée ci-dessous, on peut intérroger la base de données et extraire des informations. |
- | Pour ce faire, on utilise la langage SQL en le combinant avec le langage XPATH que PostgreSQL implémente également si le champs sur lequel porte la requête est de type 'XML'. | + | Pour ce faire, on utilise la langage SQL en le combinant avec le langage XPATH que PostgreSQL implémente également à condition que le champs sur lequel porte la requête soit de type 'XML'. |
- | Pour apprendre la syntaxe des requêtes SQL, voir la manuel PostreSQL, chapitres 2 et 7. Nous y reviendrons. Pour apprendre celle du XPATH, un excellent {{:td_histoire_numerique:obpe6630_xpath4.pdf|tutoriel}} rédigé par Wieslaw Zielonka est [[http://www.liafa.jussieu.fr/~zielonka/Enseignement/BDAvances/2013/XML/xpath4.pdf|disponible sur internet]] | + | Pour apprendre la syntaxe des requêtes SQL, voir la manuel PostreSQL, chapitres 2 et 7. Pour apprendre celle du XPATH, un excellent {{:td_histoire_numerique:obpe6630_xpath4.pdf|tutoriel}} rédigé par Wieslaw Zielonka est [[http://www.liafa.jussieu.fr/~zielonka/Enseignement/BDAvances/2013/XML/xpath4.pdf|disponible sur internet]] |
Pour exécuter les requêtes ci-dessous: | Pour exécuter les requêtes ci-dessous: | ||
- | * ouvrir la base de données 'bd_td_exercice' avec pgAdminIII, sélectionner le dossier rouge 'schémas' dans l'arboréscence, puis ouvrir la boît de dialoque 'SQL': bouton loupe. | + | * ouvrir la base de données avec pgAdminIII, sélectionner le dossier rouge 'schémas' dans l'arboréscence, puis ouvrir la boît de dialoque 'SQL': bouton loupe. |
* copier la requête dans l'Editeur SQL | * copier la requête dans l'Editeur SQL | ||
* exécuter la requête avec le bouton vert en forme de flèche | * exécuter la requête avec le bouton vert en forme de flèche | ||
Ligne 91: | Ligne 91: | ||
* pour visualiser directement le résultat avec un navigateur, sélectionner dans le menu 'Fichier' la commande 'Rapport rapide', choisir de nouveau un fichier de sortie (tout en bas), ne rien toucher aux autres paramètres et appuyer sur OK | * pour visualiser directement le résultat avec un navigateur, sélectionner dans le menu 'Fichier' la commande 'Rapport rapide', choisir de nouveau un fichier de sortie (tout en bas), ne rien toucher aux autres paramètres et appuyer sur OK | ||
* le résultat apparaîtra immédiatement dans votre navigateur web | * le résultat apparaîtra immédiatement dans votre navigateur web | ||
+ | |||
+ | Provisoire: | ||
+ | <code sql> | ||
+ | SELECT ??? | ||
+ | FROM ??? | ||
+ | </code> | ||
+ | |||
+ | ====== Documentation ====== | ||
+ | |||
+ | |||
+ | |||
+ | ===== Code SQL ===== | ||
+ | |||
+ | Dans cette section on trouvera le code des principales fonctions SQL/PLpgSQL utilisées dans la base de données. | ||
+ | |||
+ | ==== Fonction vues.transformation_xml(integer) ==== | ||
+ | |||
+ | Cette fonction transforme le texte codé avec le système des accolades en un document XML. En argument de la fonction, il faut mettre l'identifiant (la clé primaire) de la ligne dans laquelle se trouve le texte à transformer. Le texte à transformer est stocké dans le champs "texte" et sera retranscrit et enregistré automatiquement par la fonction dans le champs "texte_xml". | ||
+ | |||
+ | En cas d'incohérence du codage au niveau des accolades dans le texte de départ, un message d'erreur est produit par le serveur PostgreSQL qui perment en régle général, en cherchant le texte en question, de retrouver les passages du texte de départ qui posent problème. | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | -- Function: vues.transformation_xml(integer) | ||
+ | |||
+ | -- DROP FUNCTION vues.transformation_xml(integer); | ||
+ | |||
+ | CREATE OR REPLACE FUNCTION vues.transformation_xml(integer) | ||
+ | RETURNS character varying AS | ||
+ | $BODY$ | ||
+ | WITH tw0 AS | ||
+ | ( | ||
+ | -- transforme les entités XML | ||
+ | SELECT REPLACE(REPLACE(REPLACE(texte,'&','&'),'<','<'),'>','>') txt | ||
+ | FROM objets.objet | ||
+ | WHERE pk_objet = $1 | ||
+ | ), | ||
+ | tw1 AS | ||
+ | ( | ||
+ | -- transforme les accolades en chevrons | ||
+ | SELECT REPLACE(REPLACE(REPLACE(txt,'{/','</'),'{','<'),'}','>') txt | ||
+ | FROM tw0 | ||
+ | ), | ||
+ | tw2 AS | ||
+ | ( | ||
+ | -- traite le cas de balises à deux caractères qui contiennent le type après l'id de l'objet: ajoute l'attribut "type" | ||
+ | SELECT REGEXP_REPLACE(txt,'(<\w{2})([\d\|]+)([a-z]{2})(_?)([\d|\|]*)(>)','\1\2\4\5 type="\3"\6','g') AS txt | ||
+ | FROM tw1 | ||
+ | ), | ||
+ | tw3 AS | ||
+ | ( | ||
+ | -- traite le cas de balises à deux caractères suivies d'un 0: élimine l'attribut "ref" tout en gardant l'attribut @type | ||
+ | SELECT REGEXP_REPLACE(txt,'(<\w{2})(0)(_?)([\d|\|]*)([\s"=\w]*)(>)','\1\3\4\5\6','g') AS txt | ||
+ | FROM tw2 | ||
+ | ), | ||
+ | tw4 AS | ||
+ | ( | ||
+ | -- traite le cas de balises à deux caractères suivies ou non d'un id possédant un '_': ajoute l'attribut @ana | ||
+ | SELECT REGEXP_REPLACE(txt,'(<\w{2})([\d|\|]*)(_)([\d\|]*)([\s"=\w]*)(>)','\1\2\5 ana="\4"\6','g') AS txt | ||
+ | FROM tw3 | ||
+ | ), | ||
+ | tw5 AS | ||
+ | ( | ||
+ | -- traite le cas de balises à deux caractères suivies d'un id : ajoute l'attribut @ref | ||
+ | SELECT REGEXP_REPLACE(txt,'(<\w{2})([\d\|]+)([\s"=\w|]*)(>)','\1 ref="\2" \3\4','g') AS txt | ||
+ | FROM tw4 | ||
+ | ), | ||
+ | tw6 AS | ||
+ | ( | ||
+ | -- traite le cas de balises seg et eud possédant un '_': ajoute l'attribut @ana | ||
+ | SELECT REGEXP_REPLACE(txt,'(<)(seg|eud)(_)([\d|\|]*)(>)','\1\2 ana="\4"\5','g') AS txt | ||
+ | FROM tw5 | ||
+ | ), | ||
+ | tw7 AS | ||
+ | ( | ||
+ | -- traite le cas des dates avec un paramètre d'incertitude en ajoutant l'attribut @cert | ||
+ | SELECT REGEXP_REPLACE(txt,'(<)(dat)([0-9]+)(r|p)(_?)([a-z]{2})(>)','\1\2\3\5\6 cert="\4"\7','g') AS txt | ||
+ | FROM tw6 | ||
+ | ), | ||
+ | tw8 AS | ||
+ | ( | ||
+ | -- traite le cas des dates avec un type en ajoutant l'attribut @type | ||
+ | SELECT REGEXP_REPLACE(txt,'(<)(dat)([0-9]+)(_)([a-z]{2})','\1\2\3 type="\5"','g') AS txt | ||
+ | FROM tw7 | ||
+ | ), | ||
+ | tw9 AS | ||
+ | ( | ||
+ | -- traite le cas des dates en ajoutant l'attribut @when | ||
+ | SELECT REGEXP_REPLACE(txt,'(<)(dat)([0-9]+)','\1\2 when="\3"','g') AS txt | ||
+ | FROM tw8 | ||
+ | ) | ||
+ | UPDATE objets.objet | ||
+ | SET texte_xml = (concat('<root>',REGEXP_REPLACE(txt, '\|', ' ' , 'g'),'</root>'))::xml | ||
+ | FROM tw9 | ||
+ | WHERE pk_objet = $1; | ||
+ | |||
+ | SELECT 'Effectué'::varchar AS resultat; | ||
+ | |||
+ | |||
+ | $BODY$ | ||
+ | LANGUAGE sql VOLATILE | ||
+ | COST 100; | ||
+ | ALTER FUNCTION vues.transformation_xml(integer) | ||
+ | OWNER TO postgres; | ||
+ | |||
+ | </code> |