Format du document de dépannage Il y a des dizaines, voire des centaines, de recettes dans la liste de ma mère. Si une erreur fatale se produit, le débogage sera très difficile : vous rechercherez le marqueur manquant ligne par ligne. Si vous utilisez plusieurs niveaux d’imbrication, il sera difficile de trouver les erreurs.
Mais une bonne aide peut être trouvée. Analyseurs - Les applications qui analysent le code XML et signalent les erreurs mal formées sont disponibles gratuitement en ligne. Le meilleur d'entre eux est Lark, écrit par Tim Bray - éditeur technique et ardent défenseur de la spécification XML, l'une des personnes les plus intelligentes de la planète.
J'utilise Lark pour analyser le code ci-dessous. Notez que « pépites de chocolat » et sa balise de fermeture apparaissent au mauvais endroit dans la balise </ingredients> :
<?xml version="1.0"?>
<list>
<recipe>
<author>Carol Schmidt</author>
<recipe_name >Barres aux pépites de chocolat</recipe_name>
<repas>Dîner
<cours>Dessert</cours>
</repas>
<ingrédients>
<item>2/3 tasse de beurre</item>
<item>2 tasses de cassonade</item>
<item>1 cuillère à café de vanille</item>
<item>1 3/4 tasse de farine tout usage non tamisée</item>
<item>1 1/2 cuillère à café de levure chimique</item>
<item>1/2 cuillère à café de sel< /item>
<item>3 œufs</item>
<item>1/2 tasse de noix hachées</item>
<item>
</ingredients>2 tasses (paquet de 12 oz)
de chips de chocolat mi-sucré</item. >
<instructions>
Préchauffer à 350 degrés. Faire fondre le beurre;
mélanger avec la cassonade et la vanille dans un grand bol à mélanger.
Mélanger lafarine
, la levure chimique et le sel mis de côté;
.Incorporer les ingrédients secs réservés
, les noix et les chips.
Étaler dans un moulegraissé
de 13 x 9 pouces. Cuire au four pendant 25 à 30 minutes
jusqu'à
ce
qu'ils soient dorés. Couper en carrés.
list>
Voici les résultats renvoyés par l'analyseur :
Rapport d'erreur
Ligne 17, colonne 22 : Rencontré </ingredients> attendu </item>
... supposé </item>
Ligne 18, colonne 36 : Rencontré </item> avec pas de balise de début.
Avec ces informations, trouver l'erreur ne sera pas un problème. Alors, que signifie la validité d’un fichier XML ?
Efficacité de la mise en œuvre En fin de compte, nous ajouterons des informations à un document XML bien organisé. En fait, nous avons beaucoup à faire - des crises nous attendent encore - et même si le fichier XML est bien organisé,
Mais des informations critiques peuvent également être perdues. Jetez un œil à l'exemple suivant :
<recette>
<auteur>Carol Schmidt</auteur>
<recipe_name>Barres aux pépites de chocolat</recipe_name>
<repas>Dîner <cours>Dessert</cours> </repas>
<ingrédients> </ingrédients>
<directions>Faire fondre le beurre; mélanger avec, etc. </directions>
</recette>
Cette recette n'inclut pas d'ingrédients, et comme elle est si bien organisée,
L'analyseur Lark ne trouvera pas non plus le problème. Quiconque a géré même la plus inoffensive des bases de données connaît l'erreur que nous, les humains, commettons : si nous en avons l'occasion, nous rejetons des informations critiques et y ajoutons des absurdités inutiles. C'est pourquoi l'inventeur de XML a introduit la DTD -
Définition du type de document. Les DTD permettent de garantir que XML correspond plus ou moins à ce que vous souhaitez.
Regardons une DTD utilisée dans les recettes.
<!DOCTYPE liste [
<!ELEMENT recette (recipe_name, auteur, repas, ingrédients, directions)>
<!ELEMENT ingrédients (item+)>
<!ELEMENT repas (#PCDATA, cours ?)>
<!ELEMENT élément (#PCDATA, sub_item*)>
<!ELEMENT nom_recette (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<Cours!ELEMENT (#PCDATA)>
<!ELEMENT élément (#PCDATA)>
<!ELEMENT sous-élément (#PCDATA)>
<Instructions!ELEMENT (#PCDATA)>
]>
Le code peut sembler hostile au début, mais il prend du sens une fois décomposé. Expliquons-le en détail :
<!DOCTYPE list [
Cette ligne indique que ce qui est entre crochets est un document avec l'élément racine <list>
DTD. Comme nous l'avons mentionné précédemment, l'élément racine contient tous les autres éléments.
<!ELEMENT recette (recipe_name, repas, ingrédients, directions)>
Cette ligne définit la balise <recipe>. Les parenthèses signifient que les quatre balises doivent apparaître dans la balise <recipe> dans l'ordre.
<!ELEMENT repas (#PCDATA, course?)>
Cette ligne nécessite une explication détaillée. J'ai défini la structure suivante :
<repas>Ici le nom du repas est obligatoire
<cours>Un nom de cours peut apparaître, mais ce n'est pas le cas.
obligatoire</cours>
</repas>
Je fais cela parce que, à mon avis, le déjeuner ne doit pas nécessairement être un plat spécifique, mais le dîner peut désigner des entrées, des plats principaux et des desserts. En précisant
#PCDATA - Représente les données de caractères analysées (c'est-à-dire les données non binaires) pour implémenter cette fonctionnalité. Ici, #PCDATA est du texte – par exemple, « dîner ».
Le point d'interrogation après "course" indique que 0 ou 1 paire de balises <course> apparaîtront dans <meal>
à l'intérieur du marqueur.
Regardons maintenant la ligne suivante :
<!ELEMENT ingrédients (item+)>
Le signe plus ici indique qu'au moins une paire de balises <item> doit apparaître dans <ingredients>
à l'intérieur du marqueur.
La dernière ligne qui nous intéresse est :
<!ELEMENT item (#PCDATA, sub_item*)>
Je mets sub_item* par mesure de sécurité. En plus de demander le texte de chaque élément, je souhaite compter la quantité de contenu pour chaque élément. L'astérisque indique le nombre de sous-éléments pouvant être inclus dans la balise <item>. Je n'ai besoin d'aucun sous-élément pour la recette des barres aux pépites de chocolat, mais c'est utile lorsque les ingrédients sont complexes.
Maintenant, rassemblons cela et voyons ce que nous obtenons.
Exemple complet de DTD Vous trouverez ci-dessous un exemple complet. J'ai ajouté une autre recette au fichier et ajouté
La DTD est annotée. Vous pouvez remarquer que j'ai utilisé des sous-éléments dans la deuxième recette.
<?xml version="1.0"?>
<!--Cela démarre la DTD. Les quatre premières lignes concernent la structure du document-->.
<!DOCTYPE liste ][
<!ELEMENT recette (nom_recette, auteur, repas, ingrédients, instructions)>
<!ELEMENT ingrédients (item+)>
<!ELEMENT repas (#PCDATA, cours ?)>
<!ELEMENT élément (#PCDATA, sub_item*)>
<!--Ce sont les éléments restants de la balise de recette -->
<!ELEMENT nom_recette (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<Instructions!ELEMENT (#PCDATA)>
<!--L'élément restant de la balise repas -->
<Cours!ELEMENT (#PCDATA)>
<!--L'élément restant de la balise item -->
<!ELEMENT sub_item (#PCDATA)>
]>
<?xml version="1.0"?>
<liste>
<recette>
<auteur>Carol Schmidt</auteur>
<recipe_name>Barres aux pépites de chocolat</recipe_name>
<repas>Dîner
<cours>Dessert</cours>
</repas>
<ingrédients>
<item>2/3 T de beurre</item>
<item>2 C de cassonade</item>
<item>1 cuillère à café de vanille</item>
<item>1 3/4 T de farine tout usage non tamisée</item>
<item>1 1/2 cuillère à café de levure chimique</item>
<item>1/2 cuillère à café de sel</item>
<item>3 œufs</item>
<item>1/2 tasse de noix hachées</item>
<item>2 tasses (paquet de 12 oz) de chips de chocolat mi-sucré</item>
</ingrédients>
<instructions>
Préchauffer le four à 350 degrés. Faire fondre le beurre;
mélanger avec la cassonade et la vanille dans un grand bol à mélanger.
Laisser refroidir. Mélanger la farine, la levure chimique et le sel;
réserver.Ajouter les œufs au mélange de sucre refroidi; bien battre.
Incorporer les ingrédients secs réservés, les noix et les chips.
Étaler dans un moule graissé de 13 x 9 pouces.
Cuire au four pendant 25 à 30 minutes jusqu'à ce qu'ils soient dorés et refroidis.
Couper en carrés.
</instructions>
</recette>
<recette>
<recipe_name>Pâtes à la sauce tomate</recipe_name>
<repas>Dîner
<cours>Entrée</cours>
</repas>
<ingrédients>
<item>1 livre de spaghettis</item>
<item>1 boîte de 16 oz de tomates en dés</item>
<item>4 gousses d'ail</item>
<item>1 oignon coupé en dés</item>
<item>Assaisonnement italien
<sub_item>origan</sub_item>
<sub_item>basilic</sub_item>
<sub_item>poivron rouge broyé</sub_item>
</article>
</ingrédients>
<instructions>
Faire bouillir les pâtes. Faire revenir l'ail et l'oignon.
Ajouter les tomates. Servir chaud.
</instructions>
</recette>
</liste>
Maintenant qu'il existe une DTD, le document sera vérifié pour voir s'il est conforme aux restrictions définies par la DTD. En d’autres termes, nous voulons garantir la validité du document.
Pour y parvenir, nous avons besoin d’un autre outil : un analyseur de validité. MSXML de Microsoft, un programme basé sur Java, est facile à utiliser et fonctionne bien. Le document ci-dessus a été vérifié par ce programme et aucune erreur n'a été trouvée. Mais si je vérifie un
Les recettes qui ne contiennent pas d'élément dans la balise d'ingrédient renverront le message suivant :
les ingrédients ne sont pas complets. Éléments attendus [élément].