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?

OnesimusUnbound
la source
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>.

Joris Timmermans
la source
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 */.

Jörg W Mittag
la source
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