SELFHTML/Aides à la navigation XML/DTD Définitions de type de document (DTD) |
Les entités (Entities Singulier: Entity) sont des abréviations définies. Peut-être connaissez vous la possibilité des programmes de traitement de texte de définir des blocs de texte qui peuvent ensuite être insérés très rapidement dans le texte actuel par menu ou par un raccourci clavier. Cette fonctionnalité représente une des tâches des entités.
Les entités en XML peuvent cependant avoir plusieurs fonctions. Les blocs de texte que vous pouvez ainsi définir dont disponibles d'une part dans des fichiers d'application. Il y a les entités qui n'ont une fonction d'abréviation que dans les définitions de DTD ou les entités qui créent une relation avec des sources de données externes, et les entités qui réalisent des transcriptions pour des signes spéciaux.
Les entités sont également fréquentes dans des langage de marquage connus comme HTML. Quand par exemple vous voulez noter des suites de caractères comme é
, alors vous utilisez des entités qui ont été définies pour HTML. Pour comprendre les entités en XML, il faut vous libérer toutefois des limites de la fonctionnalité des entités en HTML.
Les entités sont notées dans une DTD d'après le schéma suivant:
<!ENTITY [%] Nom [SYSTEM|PUBLIC] "valeur" [mentions supplémentaires] > |
La définition d'une entité commence par la parenthèse pointue d'ouverture <
,suivie immédiatement d'un point d'exclamation !
Derrière en majuscules suit le mot clé ENTITY
. À la suite suit pour un paramètre entité pour bloc de texte dans la DTD un signe pourcentage %
, pas pour les autres définitions d'entités. Dans tous les cas pourtant suit un nom pour l'entité. Vous pouvez choisir librement le nom. Il doit cependant satisfaire aux règles pour les noms en XML. Derrière le nom peut être placé un des mots clés SYSTEM
ou PUBLIC
, et cela dans le cas des Entités pour ressources externes. Pour toutes les autres définitions d'entités, ne mentionnez aucun de ces mots-clés. Enfin, placée entre guillemets, la valeur que vous voulez affecter au nom d'entité. La valeur affectée peut avoir une nature très variée selon le type de l'entité. Derrière le nom, peuvent encore suivre dans des cas spéciaux des mentions particulières. Un exemple à ce sujet est donné dans la partie sur les attributs avec une valeur d'entité (par exemple pour des références de fichier externe).
Chaque définition d'entité se termine avec une parenthèse pointue de fermeture >
. Les différentes parties de la définition de l'entité sont séparées par un ou plusieurs espaces.
Vous pouvez placer une telle définition d'entité à n'importe quel endroit dans la DTD - avant ou après d'autres définitions comme <!ELEMENT...>
( Éléments), <!ATTLIST...>
( Attributs) ou bien <!NOTATION...>
( Notations). Dans chaque cas cependant, une entité doit cependant avoir été définie avant sa première utilisation. C'est à observer par exemple pour les paramètres entités pour blocs de texte de DTD où les définitions d'entités doivent être notées avant les définitions de types d'élément dans lesquels elles sont employées. Dans la pratique, on définit les entités la plupart du temps tout au début de la DTD, avant toutes les définitions d'éléments et d'attributs.
Pour des expressions plus longues qui reviennent sans arrêt dans les données d'application d'une structure XML gomme par exemple des noms propres ou des formules, vous pouvez définir des abréviations dans la DTD.
<!ELEMENT blocs_de_texte (#PCDATA)> <!ENTITY jpa "Je vous prie d'agréer mes cordiales salutations" > |
Ici s'applique le schéma pour définir les entités. Avec les entités pour blocs de texte, vous n'avez besoin que d'attribuer un nom pour l'entité et de lui attribuer la valeur désirée. Dans l'exemple une entité nommée jpa
a été définie et la valeur Je vous prie d'agréer mes cordiales salutations
lui a été affectée.
Exemple d'affichage: aperçu (un navigateur XML affiche par exemple la structure de données)
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE blocs_de_texte SYSTEM "blocs_de_texte.dtd"> <blocs_de_texte> En l'attente, &jpa; </blocs_de_texte> |
Pour utiliser une entité définie dans la DTD dans les données d'application, notez le ET commercial (&
), et directement à la suite le nom de l'entité suivi d'un point virgule de clôture (;
). L'analyseur syntaxique XML insère alors à l'endroit correspondant le long texte affecté à l'abréviation. L'exemple &jpa;
provoque donc la sortie de Je vous prie d'aggréer mes cordiales salutations
.
Vous pouvez noter cette entité dans les données d'applications partout où des chaînes de caractères sont possibles, à savoir dans un contenu de caractères, entre le repère d'ouverture et le repère de fermeture ou même dans des affectations de valeurs à des attributs, pour lesquels des chaînes de caractères sont autorisées.
Remplacez dans la chaîne de caractères que vous affectez au nom d'une entité les signes dont la valeur de caractère est plus grande que 127 par leur transcription numérique comme dans l'exemple ci-dessus é
pour é
. Les valeurs de caractères désirées peuvent être trouvées par exemple dans la liste des jeux de caractères ISO-8859.
Vous connaissez sans doute de HTML les signes nommés pour le jeu de caractères ISO 8859-1 comme ç
ou ©
. Vous pouvez définir vous même dans une DTD XML de telles désignations faciles à retenir. Ceci est indiqué avant tout pour des signes qui ne se trouvent pas sur le clavier, ou quand vous ne connaissez pas les environnements de développement et les jeux de caractères internes utilisés par les utilisateurs qui travaillent avec vos DTD XML.
<!ENTITY emoticone_triste "⍩" > <!ENTITY emoticone_heureux "⍪" > <!ELEMENT emoticone (#PCDATA)> |
En tant que graphiques les signes désirés de l'exemple ont à peu près cet aspect:
emoticone_triste
: et emoticone_heureux
:
Ici s'applique le schéma pour définir les entités. Pour les entités pour le nommage de signes, vous n'avez besoin que d'attribuer un nom pour l'entité et de lui attribuer comme valeur la notation numérique du signe sous forme décimale ou hexadécimale. Dans l'exemple, deux signes sont nommés. Leurs noms sont emoticone_triste
et emoticone_heureux
. Dans le système Unicode les deux signes désirés qui doivent être affectés à ces noms ont les valeurs hexadécimales 2369
et 236A
. La façon de noter est ici la même qu'en HTML 4.0 donc par exemple ⍪
(hexadécimal) ou ⍪
(décimal). La notation commence par le ET commercial &
, suivi d'un signe dièse #
. Quand vous notez la valeur de caractère en hexadécimal, le signe x
doit suivre suivi lui même par la valeur hexadécimale. Si vous voulez noter la valeur du caractère en décimal le chiffre suit immédiatement (sans être précédé de x
). Derrière la valeur du caractère suit un point virgule ;
.
Exemple d'affichage: aperçu (un navigateur XML affiche par exemple la structure de données)
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE emoticones SYSTEM "emoticones.dtd"> <emoticones> Es tu &emoticone_heureux; ou bien &emoticone_triste;? </emoticones> |
Pour utiliser les signes nommés dans les données d'application, notez le ET commercial (&
), et directement à la suite le nom de l'entité suivi d'un point virgule de clôture (;
). L'analyseur syntaxique XML insère alors à l'endroit correspondant le signe en question. Dans l'exemple, vous obtenez donc la même chose en notant &emoticone_heureux;
que si vous notiez ⍪
- mais le nom est plus facile à retenir.
Vous pouvez noter cette entité dans les données d'applications partout où des chaînes de caractères sont possibles, à savoir dans un contenu de caractères, entre le repère d'ouverture et le repère de fermeture ou même dans des affectations de valeurs à des attributs, pour lesquels des chaînes de caractères sont autorisées.
Quand le signe désiré n'est pas sorti, cela est dû au soutien Unicode insuffisant ou à ce que pour la sortie de données, aucune police d'écriture n'est disponible qui puisse représenter des signes Unicode à valeur élevée comme ceux de l'exemple ci-dessus.
Pour l'affectation de valeur dans une définition d'entité, il est tout à fait possible d'utiliser d'autres entités pour créer de cette façon des blocs de texte complexes.
<!ENTITY rs "Rodrigue et Chimène SARL" > <!ENTITY c "info@cid.fr" > <!ENTITY rsc "&rs;, &c;" > <!ELEMENT texte_courriel (#PCDATA)> |
Dans cet exemple, les entités rs
et c
définies auparavant sont utilisées pour l'affectation de valeur à l'entité rsc
.
Exemple d'affichage: aperçu (un navigateur XML affiche par exemple la structure de données)
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE texte_courriel SYSTEM "texte_courriel.dtd"> <texte_courriel> La firme &rs; est heureuse de vous présenter ses produits les plus récents. Veuillez envoyer votre commande à &rsc;. </texte_courriel> |
Si dans les données d'application &rsc;
est noté, ce sera remplacé par Rodrigue et Chimène SARL, info@cid.fr
. Dans le jargon spécialisé XML, on dit aussi que les différents blocs de texte &f;
et &m;
sont "avancés".
Pour les entités pour ressources externes appelées aussi entités externes (par opposition à tous les autres types d'entités qui sont désignées comme entités internes ), XML offre la possibilité de faire savoir à un analyseur syntaxique que des données d'un autre fichier doivent être incorporées.
<!ELEMENT nouvelles (donnees_nouvelles)*> <!ENTITY source_donnees SYSTEM "nouvelles.txt" > <!ELEMENT donnees_nouvelles EMPTY> <!ATTLIST donnees_nouvelles source ENTITY #REQUIRED > |
Ici s'applique le schéma pour définir les entités. Avec des entités pour ressources externes, vous devez noter en plus du nom de l'entité, un des deux mots-clés SYSTEM
ou bien PUBLIC
(à écrire l'un et l'autre en majuscules). Quand vous désignez la source de données externe directement avec le nom de fichier, alors utilisez SYSTEM
. Pour l'affectation de valeur, notez alors le nom de fichier de la source externe, le cas échéant avec une mention de chemin relative ou absolue. Cela peut être aussi une URI, par exemple http://www.xy.fr/nouvelles/nouvelles.txt
. Si à la place, vous notez une désignation de source publique (public identifier), alors mentionnez PUBLIC
et notez pour l'affectation de valeur la désignation de la source publique de la source des données.
Vous ne pouvez utiliser une entité pour ressource externe dans une application XML qu'en en affectant le nom de l'entité à un attribut. C'est une particularité de ce genre d'entités. C'est pourquoi vous devez définir dans la DTD, outre l'entité, également un attribut avec une valeur d'entité pour un type d'élément quelconque souhaité. Dans l'exemple ci-dessus un type d'élément donnees_nouvelles
avec un attribut source
est défini. Cet attribut est fixé grâce à la mention ENTITY
comme étant un attribut avec une valeur d'entité.
Exemple d'affichage: aperçu (un navigateur XML affiche la structure de données)
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE nouvelles SYSTEM "nouvelles.dtd"> <nouvelles> <donnees_nouvelles source="source_donnees" /> </nouvelles> |
Le nom d'entité "source_donnees"
a été affecté à l'élément donnees_nouvelles
par l'attribut source
. Ce nom est alors remplacé par la liaison "nouvelles.txt"
qui lui est liée. L'analyseur syntaxique est "informé" en même temps qu'il ne s'agit pas d'un remplacement de texte mais de la mention d'une référence externe.
Pour que la référence externe puisse être insérée à l'endroit correspondant, l'analyseur syntaxique doit naturellement pouvoir traiter cette information et connaître le chemin pour afficher les données correspondantes. Des mentions supplémentaires sont indispensables pour la définition en particulier pour des données binaires, par exemple pour des graphiques. Vous en trouverez un exemple dans la partie sur les Attributs avec une valeur d'entité.
XML est silencieux, en ce qui concerne les mentions de chemin locales (SYSTEM
), sur la syntaxe exacte. Si l'ordinateur tourne sous Windows, il peut tout à fait être nécessaire d'utiliser pour le chemin des barres obliques inversées \
au lieu de la barre oblique typique chez Unix /
. De la même façon il dépend de l'analyseur syntaxique en service s'il pourra trouver l'URI mentionnée ou non.
Un exemple d'utilisation d'une désignation publique (public identifier) pourrait donner:
<!ENTITY % HTML_Chars PUBLIC "-//W3C//ENTITIES Latin1//EN//HTML" >
%HTML_Chars;
Avec une telle désignation, vous incorporez les signes nommés de HTML dans votre DTD. De plus amples détails pour l'incorporation de ressources externes dans une DTD peuvent être trouvés dans la partie sur les DTD modulaires à l'aide d'entités.
Certains analyseurs syntaxiques protestent avec des exemples comme celui ci-dessus, bien qu'ils soient conformes à XML.
Les paramètres entités permettent de définir des "Macros" pour une utilisation dans la DTD. Leur mise en œuvre est particulièrement indiquée quand certaines mentions plus complexes sur le contenu de types d'élément reviennent pour plusieurs types d'éléments. Ainsi par exemple on peut récapituler des formatages dans un texte comme en caractères gras, en italique, en couleur, souligner etc... en une macro "formatage_de_texte". Si maintenant on définit des éléments de texte significatifs comme des titres, des éléments de listes ou des cellules de tableaux, ce serait un travail de copie inutiles d'attribuer à chacun de ces éléments de texte è chaque fois toutes les possibilités de formatage. Il est plus simple de n'affecter que la macro "formatage_de_texte". Ainsi les paramètres entités améliorent-ils la lisibilité et les possibilités de modification dans des DTD complexes.
<!ENTITY % article "numero_article, nom_article, quantite_article"> <!ENTITY % additif "description | classe_produit"> <!ELEMENT stock (entree | sortie)*> <!ELEMENT entree (numero_entree, (%article;), (%additif;))> <!ELEMENT sortie (numero_sortie, (%article;), (%additif;))> <!ELEMENT numero_entree (#PCDATA)> <!ELEMENT numero_sortie (#PCDATA)> <!ELEMENT numero_article (#PCDATA)> <!ELEMENT nom_article (#PCDATA)> <!ELEMENT quantite_article (#PCDATA)> <!ELEMENT description (#PCDATA)> <!ELEMENT classe_produit (#PCDATA)> |
L'exemple représente l'extrait de la DTD d'un fichier dans lequel sont consignés les mouvements de stock. Dans le stock, il y a des entrées et des sorties de matériel. Dans chaque enregistrement il doit y avoir une entrée ou une sortie d'un certain produit. Un article en relation avec une sortie ou une entrée de matériel est toujours composé des mêmes données: d'un numéro d'article, nom d'article, quantité d'article et d'un additif de description, qui est soit une description d'article générale ou la classification dans une classe de produit. Ces données interactives peuvent être résumées en paramètres entités dans les définitions de types d'élément.
Dans l'exemple, deux paramètres entités sont définis: article
et additif
. Ici s'applique le schéma pour définir les entités.. Avant le nom d'un paramètre entité notez le signe pourcentage %
. Pour l'affectation de valeur, notez une mention sur le contenu d'un type d'élément. Il ne s'agit pas vraiment de la mention sur le contenu d'un type d'élément mais simplement d'un bloc de texte, d'une macro que vous pourrez utiliser dans la définition du type d'élément à venir. Dans les deux paramètres entités de l'exemple ci-dessus sont définies des mentions pour les contenus d'élément.
Dans l'exemple, les paramètres entités sont utilisés lors de la définition des types d'élément entree
et sortie
. Les deux types d'élément ont un contenu d'éléments. Ils comportent un numéro de série pour l'entrée ou la sortie, le numéro d'article et le nom d'article, résumés par l'emploi du paramètre entité article
, et au choix d'une description d'article ou d'une classe de produits résumés par l'emploi du paramètre entité additif
.
Lors de l'utilisation d'un paramètre entité dans une définition de type d'élément, vous devez respecter la notation telle qu'elle est notée dans l'exemple. Les paramètres entités doivent être mis entre parenthèses. Tout de suite avant le nom du paramètre entité (sans espace les séparant) le signe pourcentage %
doit figurer. Derrière le nom, il faut noter un point virgule ;
.
Exemple d'affichage: aperçu (un navigateur XML affiche par exemple la structure de données)
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE stock SYSTEM "stock.dtd"> <stock> <entree> <numero_entree>452</numero_entree> <numero_article>45-234</numero_arcicle> <nom_article>fauteuil de bureau "ministre"</nom_article> <quantite_article>10</quantite_article> <classe_produit>C-III</classe_produit> </entree> <sortie> <numero_sortie>318</numero_sortie> <numero_arcicle>37-917</numero_arcicle> <nom_article>armoire à glaces "Narcisse"</nom_article> <quantite_article>3</quantite_article> <description>F-IV</description> </sortie> </stock> |
L'exemple d'application n'apporte rien de plus si ce n'est la définition des types d'éléments entree
et sortie
qui repose en partie sur l'emploi de paramètres entités. Les paramètres entités ne sont donc significatifs que dans les définitions de la DTD, ils n'ont pas d'influence sur l'application. L'exemple d'application des définitions de la DTD montre deux enregistrements, un pour une entrée de matériel, l'autre pour une sortie de matériel. Les éléments intérieurs y sont notés comme les règles définies le permettent.
Pour l'élaboration de structures de données plus complexes, il est souvent avisé de répartir les définitions sur plusieurs DTD: À l'aide d'entités, il vous est possible d'importer des DTD dans d'autres DTD en tant que modules. Ainsi par exemple dans un système de données de gestion, la possibilité est offerte d'établir une DTD séparée avec les structures de données d'un produit, DTD qui peut ensuite être importée dans différentes autres structures de données par exemple celle pour u8ne commande du produit ou bien celle pour la gestion des stocks.
<!ELEMENT produit (numero_produit,description,fabricant)> <!ELEMENT numero_produit (#PCDATA)> <!ELEMENT description (#PCDATA)> <!ELEMENT fabricant (#PCDATA)> |
<!ENTITY % donnees_produit SYSTEM "produit.dtd" > %donnees_produit; <!ELEMENT commandes (commande)*> <!ELEMENT commande (produit,client,nombre,prix)*> <!ELEMENT client (#PCDATA)> <!ELEMENT nombre (#PCDATA)> <!ELEMENT prix (#PCDATA)> |
Dans la DTD nommée produit.dtd un type d'élément produit
avec un contenu d'éléments est défini. Le contenu d'éléments comprend les types d'élément numero_produit
, description
et fabricant
, qui peuvent avoir chacun un contenu de caractères.
Dans la deuxième DTD nommée commande.dtd la DTD pour les données de produits est alors incorporée. Pour ce faire est d'abord définie une entité pour ressources externes avec la nom donnees_produit
. Elle mène à l'autre DTD produit.dtd. Il est important ici de noter le signe pourcentage devant le nom d'entité comme il convient pour des paramètres entités pour blocs de texte de DTD. Car vous mentionnez avec le signe pourcentage que vous voulez utiliser l'entité dans la DTD actuelle et que son contenu doit être interprété comme partie intégrante de la DTD.
L'entité ainsi définie sera ensuite notée seule dans chaque autre définition de la DTD (%donnees_produit;
). Par ce biais, les définitions de produit.dtd seront incorporées à cette endroit et pourront être employées dans les définitions suivantes. Dans l'exemple ci-dessus, vous pouvez le remarquer à la définition du type d'élément commande
. Ce type d'élément contient comme contenu d'éléments quatre types d'éléments. Parmi eux, trois seulement sont définis dans la DTD actuelle, à savoir client
, nombre
et prix
. L'autre type d'élément produit
est celui qui est défini dans produit.dtd.
Exemple d'affichage: aperçu (un navigateur XML affiche par exemple la structure de données)
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE commandes SYSTEM "commandes.dtd"> <commandes> <commande> <produit> <numero_produit>39304</numero_produit> <description>perceuse XPL75</description> <fabricant>Bohringer & fils</fabricant> </produit> <client>Uniprix, Filiale de Venelles</client> <nombre>100</nombre> <prix>45900,00</prix> </commande> <commande> <produit> <numero_produit>92842</numero_produit> <description>Bonnet de bain Monaco</description> <fabricant>Etienne Monet</fabricant> </produit> <client>La mode à l'eau, Dunkerque</client> <nombre>10</nombre> <prix>234,00</prix> </commande> </commandes> |
Dans le fichier d'application est mentionné en fin de compte le fichier commandes.dtd. Pourtant, même le fichier produit.dtd est lui aussi déterminant étant donné qu'il a été incorporé dans le fichier commandes.dtd. Car à l'endroit dans commandes.dtd, où le contenu d'éléments produit
a été affecté au type d'élément commande
, c'est toute la définition du type d'élément produit
de produit.dtd dont il s'agit.
Notations pour données référencées | |
Attributs et affectation de valeurs | |
SELFHTML/Aides à la navigation XML/DTD Définitions de type de document (DTD) |
© 2001 Stefan Münz / © 2003 Traduction Serge François, 13405@free.fr
selfhtml@fr.selfhtml.org