Por que um comentário xml não pode conter dois hífens

15

Eu estava aplicando comentários de remarcação nos comentários xml de um arquivo de configuração quando o XmlParser relatou que dois hífens ( --) não são permitidos nos comentários xml.

Verificando a especificação XML , parece que o comentário xml não foi projetado para conter dois hífens por motivos de compatibilidade com os analisadores SGML.

Por que os analisadores SGML não permitem hífens duplos nos comentários?

OnesimusUnbound
fonte
2
Eu não acho que você obterá uma resposta melhor do que "porque é isso que o padrão diz"
jk.
Bem, é que é a única resposta, então eu não tenho escolha :-(, embora possa haver uma melhor resposta do que isso.
OnesimusUnbound

Respostas:

29

Esta página descreve um pouco da história do HTML / SGML e as regras bastante complicadas desses dois hífens consecutivos (traço duplo).

A parte relevante sobre SGML:

Simplificando, o traço duplo no início e no final do comentário não inicia e termina o comentário. Traço duplo indica uma alteração no que o comentário pode conter. O primeiro - inicia o comentário e informa ao navegador que o comentário pode conter caracteres> sem terminar o comentário. O segundo - não termina o comentário. Diz ao navegador que, se encontrar um caractere, deve terminar o comentário. Se outro - for adicionado, ele voltará a permitir os caracteres>.

Joris Timmermans
fonte
7
A seção a que você está se referindo . Quando leio o que as especificações SGML pretendem --no comentário, minha cabeça gira em torno da complexidade que apresentará mais tarde.
usar o seguinte
1
O conselho para nunca usar --dentro de um comentário parece bom para mim. Mas, existe uma maneira padrão de escapar disso? Suponha que eu queira criar (e compartilhar) um filtro de saída para garantir que foo -- barnunca cause um problema. Existe um equivalente SGML de foo -\- bar? (Tenho certeza de que não é uma barra invertida!) Ou -(veja esta resposta ), ou algo mais? Se apenas substituirmos --por -ou - -, o escape não é reversível.
Fazy
11

Porque um hífen duplo é o delimitador de comentários no SGML. O <!inicia uma instrução SGML, a --indica um comentário. Então, basicamente, é pela mesma razão que um comentário em C ++ não pode conter */.

Jörg W Mittag
fonte
1
Eu acho que -->é o delimitador de comentários.
OnesimusUnbound
10
Não não é. <!inicia uma instrução SGML e >termina-a. Dentro de uma instrução SGML, --inicia e termina um comentário.
Jörg W Mittag
7
Ahh, adicione seu comentário à resposta, isso é esclarecedor porque significa que você pode escrever <! SomeRelevantSgmlTag - um comentário - someAttribute = "blabla" - outro comentário -> e o significado semântico seria <! SomeRelevantSgmlTag someAttribute = " blabla ">
Jimmy Hoffa
1
Ah, faz sentido. --> é na verdade dois tokens, o --de delimitar o comentário e >finalizar a instrução SGML. Agora, tenho uma ideia de onde <![CDATA[... se ]]>originou.
carregar
Eu mesclei o comentário.
Joris Timmermans