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.