Чому коментар 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? (Я впевнений, що це не зворотний кут!) Або -(див. Цю відповідь ), чи щось інше? Якщо ми просто замінити --з -або - -, тікає не є оборотним.
fazy

12

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


1
Я думаю, що -->це роздільник коментарів.
OnesimusUnbound

10
Ні, це не. <!запускає інструкцію SGML, >закінчує її. У інструкції SGML --коментар починається і закінчується.
Йорг W Міттаг

7
Ах, додайте ваш коментар до відповіді, це висвітлює, оскільки це означає, що ви можете написати <! SomeRelevantSgmlTag - коментар - someAttribute = "blabla" - інший коментар ->, а семантичне значення буде <! SomeRelevantSgmlTag someAttribute = " blabla ">
Джиммі Хоффа

1
Ах, має сенс. --> насправді два лексеми, --для обмеження коментарів та >закінчення інструкції SGML. Тепер я маю уявлення про те, звідки <![CDATA[]]>виникла.
OnesimusUnbound

Я об'єднав коментар.
Joris Timmermans
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.