Почему xml-комментарий не может содержать два дефиса?

16

Я применял комментарии уценки в xml-комментариях файла конфигурации, когда XmlParser сообщил, что два дефиса ( --) не разрешены в xml-комментариях.

При проверке спецификации XML выясняется, что xml-комментарий не предназначен для того, чтобы содержать два дефиса по причинам совместимости с синтаксическими анализаторами SGML.

Почему парсеры SGML запрещают использование двойных дефисов в комментариях?

OnesimusUnbound
источник
2
Я не думаю, что вы получите лучший ответ, чем "потому что это то, что говорит стандарт"
JK.
Ну, это единственный ответ, тогда у меня нет выбора :-(, хотя может быть лучший ответ, чем этот.
OnesimusUnbound

Ответы:

30

На этой странице описывается довольно много истории HTML / SGML и довольно запутанные правила этих двух последовательных дефисов (двойная черта).

Соответствующая часть о SGML:

Проще говоря, двойная черта в начале и конце комментария не начинается и не заканчивается комментарием. Двойная черта указывает на то, что комментарий может содержать комментарий. Первый - запускает комментарий и сообщает браузеру, что комментарий может содержать> символы без окончания комментария. Второе - не заканчивается комментарий. Он сообщает браузеру, что если он встречает символ>, он должен завершить комментарий. Если другой - добавлен, он возвращается к разрешению символов>.

Йорис Тиммерманс
источник
7
Раздел, на который вы ссылаетесь . Когда я прочитал, для чего предназначены спецификации SGML --в комментарии, моя голова кружится вокруг сложности, которую он представит позже.
OnesimusUnbound
1
Совет никогда не использовать --внутри комментария кажется мне хорошим. Но есть ли стандартный способ избежать этого? Предположим, я хочу создать (и поделиться) выходной фильтр, чтобы гарантировать, что foo -- barникогда не вызывает проблем. Есть ли SGML-эквивалент foo -\- bar? (Я уверен, что это не обратная косая черта, хотя!) Или -(см. Этот ответ ), или что-то еще? Если мы просто заменим --на -или - -, выход не будет обратимым.
Фази
12

Потому что двойной дефис является разделителем комментариев в SGML. <!Запускает команду SGML, то --указывает на комментарий. Так что в основном по той же причине, что комментарий C ++ не может содержать */.

Йорг Миттаг
источник
1
Я думаю, что -->это разделитель комментариев.
OnesimusUnbound
10
Нет это не так. <!запускает инструкцию SGML, >заканчивает ее Внутри инструкции SGML --начинается и заканчивается комментарий.
Йорг Миттаг
7
Ааа, добавьте свой комментарий к ответу, это освещает, потому что это означает, что вы могли бы написать <! SomeRelevantSgmlTag - комментарий - someAttribute = "blabla" - другой комментарий ->, и семантическое значение было бы <! SomeRelevantSgmlTag someAttribute = " блабла ">
Джимми Хоффа
1
Ах, имеет смысл. --> на самом деле это два токена, --чтобы разделить комментарий и >завершить инструкцию SGML. Теперь у меня есть идея о том, где <![CDATA[... ]]>возникла.
OnesimusUnbound
Я слил комментарий.
Йорис Тиммерманс