Комментарии XML и "-"

<!-- here is some comment --
                            ^
                            |
                    what can be here apart from '>'?

Кажется, что XML не нравится "-" внутри комментариев. Я где-то читал, что "-" переключает некоторые режимы внутри объекта <! ... >, но <!-- -- -- --> (четное число -- s) также недействительно. Если это какая-то историческая особенность, что это за "про"? ( "contra" часть неспособна иметь -- в комментариях).

В чем причина усложнения обработки комментариев, если не сделать только "- > " конец комментария и разрешить "-" внутри?

Ответ 1

Из документа стандартов:

http://www.w3.org/TR/REC-xml/#sec-comments

[Определение: комментарии могут появляться в любом месте документа за пределами другого разметки; кроме того, они могут отображаться в типе документа декларация в местах, разрешенных грамматикой. Они не являются частью символьные данные документа; XML-процессор может, но не обязательно, сделать это возможно, приложение может получить текст комментариев. Для , строка "-" (двойная дефиса) не должна происходить внутри комментарии.] Ссылки на объекты параметров не должны распознаваться внутри комментарии.

Ответ 2

Возможно, это может быть полезно для кого-то. У меня была проблема, что я хотел бы прокомментировать параметр командной строки в XML, который начинается с -:

<arg line="-v --line-break 0" />  

так естественным образом, как этот

<!-- <arg line="-v --line-break 0" /> -->

не работал, но я узнал, что если - заменен на него эквивалентом UTF-8 &#x002D;, он работает и может быть допущен внутри комментариев.

Итак, в моем случае строка

<arg line="-v &#x002d;&#x002d;line-break 0" />

корректно анализируется и может быть частью комментариев.

Конечно, это выглядит немного уродливо, но если кто-то хочет сохранить строку - как комментарий в своем XML - я думаю, что это все еще лучше, чем ничего.

Ответ 3

Это один из тех глупых правил, что в XML, потому что он был в SGML, и люди не хотели нарушать совместимость. Почему в SGML кто-то догадывается: возможно, потому, что он сохранил три строки кода в исходном парсере.

Ответ 4

-- не разрешено для совместимости с SGML. Из В SGML и HTML:

Не допускается пробел между объявлением разметки разделитель ( "<!" ) и открытый разделитель комментариев ( "-" ), но разрешено между ограничителем закрытия комментария ( "-" ) и разметкой разделитель объявления ( " > " ). Общей ошибкой является включение строка дефисов ( "---" ) в комментарии. Авторы должны избегать помещая два или более смежных дефиса внутри комментариев.

Итак, в SGML <! и > открывать и закрывать "объявления разметки" и -- открывает и закрывает комментарии.