Pourquoi un commentaire xml ne peut-il pas contenir deux tirets


16

J'appliquais des commentaires de démarque dans les commentaires xml d'un fichier de configuration lorsque le XmlParser a signalé que deux tirets ( --) n'étaient pas autorisés dans les commentaires xml.

En vérifiant la spécification XML , il apparaît que le commentaire xml n'est pas conçu pour contenir deux tirets pour des raisons de compatibilité avec les analyseurs SGML.

Pourquoi les analyseurs SGML interdisent-ils les doubles tirets dans les commentaires?


2
Je ne pense pas que vous obtiendrez une meilleure réponse que "parce que c'est ce que dit la norme"
jk.

Eh bien, c'est la seule réponse, alors je n'ai pas le choix :-(, bien qu'il puisse y avoir une meilleure réponse que cela.
OnesimusUnbound

Réponses:


30

Cette page décrit un peu l'histoire de HTML / SGML et les règles plutôt compliquées de ces deux tirets consécutifs (double tiret).

La partie pertinente sur SGML:

Pour faire simple, le double tiret au début et à la fin du commentaire ne démarre ni ne termine le commentaire. Un double tiret indique un changement dans ce que le commentaire est autorisé à contenir. Le premier - démarre le commentaire et indique au navigateur que le commentaire est autorisé à contenir> caractères sans terminer le commentaire. Le second - ne termine pas le commentaire. Il indique au navigateur que s'il rencontre un caractère>, il doit alors terminer le commentaire. Si un autre - est ajouté, cela revient à autoriser les caractères>.


7
La section à laquelle vous faites référence . Quand j'ai lu ce à quoi les spécifications SGML étaient destinées --dans le commentaire, ma tête tourne autour de la complexité qu'elle introduira plus tard.
OnesimusUnbound

1
Le conseil de ne jamais utiliser --dans un commentaire me semble bon. Mais, existe-t-il un moyen standard pour y échapper? Supposons que je veuille créer (et partager) un filtre de sortie pour m'assurer de foo -- barne jamais causer de problème. Existe-t-il un équivalent SGML foo -\- bar? (Je suis sûr que ce n'est pas une barre oblique inversée!) Ou -(voir cette réponse ), ou autre chose? Si nous remplaçons simplement --par -ou - -, l'échappement n'est pas réversible.
Fazy

12

Parce qu'un double trait d'union est le délimiteur de commentaire dans SGML. Le <!démarre une instruction SGML, le --indique un commentaire. Donc, fondamentalement, c'est pour la même raison qu'un commentaire C ++ ne peut pas contenir */.


1
Je pense que -->c'est le délimiteur de commentaires.
OnesimusUnbound

10
Non, ça ne l'est pas. <!démarre une instruction SGML, la >termine. Dans une instruction SGML --commence et termine un commentaire.
Jörg W Mittag

7
Ahh ajoutez votre commentaire à la réponse, cela est éclairant car cela signifie que vous pouvez écrire <! SomeRelevantSgmlTag - un commentaire - someAttribute = "blabla" - un autre commentaire -> et la signification sémantique serait <! SomeRelevantSgmlTag someAttribute = " blabla ">
Jimmy Hoffa

1
Ah, c'est logique. --> est en fait deux jetons, --pour délimiter le commentaire et >pour terminer l'instruction SGML. Maintenant, j'ai une idée d'où <![CDATA[... ]]>est originaire.
OnesimusUnbound

J'ai fusionné le commentaire.
Joris Timmermans
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.