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


16

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

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

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


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

Я слил комментарий.
Йорис Тиммерманс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.