Les deux révisions précédentesRévision précédente | |
issue115:freepascal [2016/12/10 12:32] – auntiee | issue115:freepascal [2016/12/11 17:14] (Version actuelle) – andre_domenech |
---|
Comprendre le langage XML | Comprendre le langage XML |
| |
Le XML (EXtended Meta Language - Méta-langage étendu) est un langage simple en mode texte dont le but est de structurer les données sous forme d'arbre : chaque élément de données peut avoir aucun ou plusieurs nœuds enfant. En revanche, chaque élément doit avoir un unique parent - sauf pour un seul nœud dans tout l'arbre, qui est donc appelé l'élément racine. Chaque élément doit s'ouvrir avec une étiquette de début, tel que <élément>. L'étiquette de fin correspondante sera </élément>. | Le XML (EXtended Meta Language - Méta-langage étendu) est un langage simple en mode texte dont le but est de structurer les données sous forme d'arbre : chaque élément de données peut avoir aucun ou plusieurs nœuds enfant. En revanche, chaque élément doit avoir un unique parent, sauf pour un seul nœud dans tout l'arbre, qui est donc appelé l'élément racine. Chaque élément doit s'ouvrir avec une étiquette de début, tel que <élément>. L'étiquette de fin correspondante sera </élément>. |
| |
Peut-être qu'un exemple peut aider. Si nous souhaitons codifier une bibliothèque, par exemple, notre élément racine sera la bibliothèque elle-même. Cette bibliothèque peut ensuite contenir un élément définissant son propriétaire et peut-être un autre donnant la date à laquelle le jeu de données a été compilé. Enfin, nous créerons un élément pour chaque livre de la bibliothèque, en donnant ses titre et auteur. | Peut-être qu'un exemple peut aider. Si nous souhaitons codifier une bibliothèque, par exemple, notre élément racine sera la bibliothèque elle-même. Cette bibliothèque peut ensuite contenir un élément définissant son propriétaire et peut-être un autre donnant la date à laquelle le jeu de données a été compilé. Enfin, nous créerons un élément pour chaque livre de la bibliothèque, en donnant ses titre et auteur. |
TFileStream sera utilisé pour accéder au fichier XML sur le disque local et le rendre disponible à TXMLReader à travers une classe d'adaptation, TXMLInputSource. L'objet TXMLReaderSettings est nécessaire pour passer les paramètres au lecteur. | TFileStream sera utilisé pour accéder au fichier XML sur le disque local et le rendre disponible à TXMLReader à travers une classe d'adaptation, TXMLInputSource. L'objet TXMLReaderSettings est nécessaire pour passer les paramètres au lecteur. |
| |
Nous commençons par configurer les paramètres, essentiellement en disant au lecteur d'ignorer les espaces blancs supplémentaires (les vrais blancs, mais aussi les changements de ligne et les tabulations) et d'utiliser les noms d'espace XML si disponibles - bien que nous n'en ayons pas besoin ici : | Nous commençons par configurer les paramètres, essentiellement en disant au lecteur d'ignorer les espaces blancs supplémentaires (les vrais blancs, mais aussi les changements de lignes et les tabulations) et d'utiliser les noms d'espace XML si disponibles, bien que nous n'en ayons pas besoin ici : |
| |
settings := TXMLReaderSettings.Create; | settings := TXMLReaderSettings.Create; |
Aussi, nous voulons isoler les éléments individuels <title> (titre), et, dans chaque élément, le <link> (lien) correspondant. D'un côté, nous avons une routine en CURL qui récupère le contenu d'une URL et produit un Stream lisible. De l'autre côté, nous avons un analyseur XML qui peut analyser un Stream scriptible. Le lien est évident : nous avons besoin maintenant d'un mécanisme pour « tuber » le premier Stream vers le second ; dans Free Pascal, le mécanisme est un « piped stream » (flux en tube). Faisons-le. D'abord, nous avons besoin d'un double jeu de variables (page suivante, en haut à droite). | Aussi, nous voulons isoler les éléments individuels <title> (titre), et, dans chaque élément, le <link> (lien) correspondant. D'un côté, nous avons une routine en CURL qui récupère le contenu d'une URL et produit un Stream lisible. De l'autre côté, nous avons un analyseur XML qui peut analyser un Stream scriptible. Le lien est évident : nous avons besoin maintenant d'un mécanisme pour « tuber » le premier Stream vers le second ; dans Free Pascal, le mécanisme est un « piped stream » (flux en tube). Faisons-le. D'abord, nous avons besoin d'un double jeu de variables (page suivante, en haut à droite). |
| |
Le premier jeu est celui utilisé pour la bibliothèque CURL, le second sera pour les flux d'entrée et de sortie qui seront analysés ensemble, et le troisième jeu sera pour l'analyseur XML. Enfin, les deux chaînes et les variables booléennes associées seront nécessaires pour relier chaque élément (de type ntElement) à sa valeur associée (type ntText) - qui n'est pas l'élément lui-même, mais un sous-élément inséré dans l'élément parent. Malheureusement, l'élément textuel n'est pas toujours en première position dans les éléments enfants ; aussi, un jeu plutôt alambiqué d'indicateurs (les variables booléennes) doit être utilisé pour les détecter. | Le premier jeu est celui utilisé pour la bibliothèque CURL, le second sera pour les flux d'entrée et de sortie qui seront analysés ensemble, et le troisième jeu sera pour l'analyseur XML. Enfin, les deux chaînes et les variables booléennes associées seront nécessaires pour relier chaque élément (de type ntElement) à sa valeur associée (type ntText), qui n'est pas l'élément lui-même, mais un sous-élément inséré dans l'élément parent. Malheureusement, l'élément textuel n'est pas toujours en première position dans les éléments enfants ; aussi, un jeu plutôt alambiqué d'indicateurs (les variables booléennes) doit être utilisé pour les détecter. |
| |
Nous n'irons pas plus loin, que ce soit dans la description de la bibliothèque CURL, que nous avons décrite dans l'article précédent de cette série, ni à propos de l'analyseur XML. Nous nous concentrerons plutôt sur l'utilisation des flux en tube. Nous créerons les deux flux ensemble : | Nous n'irons pas plus loin, que ce soit dans la description de la bibliothèque CURL, que nous avons décrite dans l'article précédent de cette série, ni à propos de l'analyseur XML. Nous nous concentrerons plutôt sur l'utilisation des flux en tube. Nous créerons les deux flux ensemble : |
La façon peut-être la plus élégante de le faire - et la moins chère en écriture de code - est de créer un nouveau type Dialog. Appelé TUpDateDialog, il sera montré à l'écran juste avant la création de TDisplaySQLDialog. Ainsi, dans la procédure HandleEvent de l'application principale, nous avons ce qui est montré sur la page suivante, en haut à droite. | La façon peut-être la plus élégante de le faire - et la moins chère en écriture de code - est de créer un nouveau type Dialog. Appelé TUpDateDialog, il sera montré à l'écran juste avant la création de TDisplaySQLDialog. Ainsi, dans la procédure HandleEvent de l'application principale, nous avons ce qui est montré sur la page suivante, en haut à droite. |
| |
TUpDateDialog n'a besoin d'aucune entrée externe, car il utilisera toujours la même URL cible pour se connecter à Internet, mais seulement du nom de fichier de la base de données locale pour ajouter chaque donnée trouvée dans les nouveaux numéros du FCM. Pour ce Dialog il ne faudra qu'un « constructor » (constructeur) qui le bâtira et déclenchera le processus : | TUpDateDialog n'a besoin d'aucune entrée externe - car il utilisera toujours la même URL cible pour se connecter à Internet -, mais seulement du nom de fichier de la base de données locale pour ajouter chaque donnée trouvée dans les nouveaux numéros du FCM. Pour ce Dialog il ne faudra qu'un « constructor » (constructeur) qui le bâtira et déclenchera le processus : |
| |
TUpdateDialog = object(TDialog) | TUpdateDialog = object(TDialog) |
• Une URL et un PCurl pour aller sur Internet et récupérer un flux accédant aux informations du FCM. | • Une URL et un PCurl pour aller sur Internet et récupérer un flux accédant aux informations du FCM. |
• Deux tubes, pour préparer la connexion entre le flux d'entrée venant d'Internet et le flux de sortie vers le lecteur XML. | • Deux tubes, pour préparer la connexion entre le flux d'entrée venant d'Internet et le flux de sortie vers le lecteur XML. |
• Le lecteur XML lui-même, ses paramètres associées et plusieurs variables pour identifier le code d'identification de chaque nouveau numéro (par ex., 111), le titre (par ex., ‘Full Circle Magazine #111’) et le lien de téléchargement. | • Le lecteur XML lui-même, ses paramètres associés et plusieurs variables pour identifier le code d'identification de chaque nouveau numéro (par ex. 111), le titre (par ex. ‘Full Circle Magazine #111’) et le lien de téléchargement. |
• Un gestionnaire pour la connexion de SQLite à la base de données locale. | • Un gestionnaire pour la connexion de SQLite à la base de données locale. |
| |