Perché un commento XML non può contenere due trattini


15

Stavo applicando commenti markdown nei commenti XML di un file di configurazione quando XmlParser ha riferito che due trattini ( --) non sono ammessi nei commenti XML.

Controllando le specifiche XML , sembra che il commento XML non sia progettato per contenere due trattini per motivi di compatibilità con i parser SGML.

Perché i parser SGML non consentono i doppi trattini nei commenti?


2
Non credo che otterrai una risposta migliore di "perché è quello che dice lo standard"
jk.

Bene, è l'unica risposta, quindi non ho altra scelta :-(, anche se potrebbe esserci una risposta migliore di quella.
Onesimus

Risposte:


29

Questa pagina delinea un po 'della storia HTML / SGML e le regole piuttosto contorte di quei due trattini consecutivi (doppio trattino).

La parte rilevante su SGML:

Per dirla semplicemente, il doppio trattino all'inizio e alla fine del commento non inizia e termina il commento. Il doppio trattino indica una modifica di ciò che il commento può contenere. Il primo: avvia il commento e comunica al browser che il commento può contenere> caratteri senza terminare il commento. Il secondo - non termina il commento. Indica al browser che se incontra un carattere>, deve quindi terminare il commento. Se ne viene aggiunto un altro, torna a consentire i caratteri>.


7
La sezione a cui ti riferisci . Quando leggo ciò che le specifiche SGML intendono --includere nel commento, la mia testa gira intorno alla complessità che introdurrà in seguito.
Onesimus Nessun impegno,

1
Il consiglio di non usare mai --all'interno di un commento mi sembra buono. Ma esiste un modo standard per evitarlo? Supponiamo di voler creare (e condividere) un filtro di output per garantire che foo -- barnon causi mai un problema. Esiste un equivalente SGML di foo -\- bar? (Sono sicuro che non è una barra rovesciata!) O -(vedi questa risposta ) o qualcos'altro? Se sostituiamo semplicemente --con -o - -, la fuga non è reversibile.
Fazy

11

Perché un doppio trattino è il delimitatore di commento in SGML. Il <!inizia un'istruzione SGML, il --indica un commento. Quindi sostanzialmente è per lo stesso motivo che un commento C ++ non può contenere */.


1
Penso che -->sia il delimitatore dei commenti.
Onesimus Nessun impegno specifico

10
No non lo è. <!avvia un'istruzione SGML, la >termina. All'interno di un'istruzione SGML --entrambi iniziano e finiscono un commento.
Jörg W Mittag,

7
Ahh aggiungi il tuo commento alla risposta, questo è illuminante perché significa che potresti scrivere <! SomeRelevantSgmlTag - un commento - someAttribute = "blabla" - un altro commento -> e il significato semantico sarebbe <! SomeRelevantSgmlTag someAttribute = " blabla ">
Jimmy Hoffa

1
Ah, ha senso. --> è in realtà due token, il --per delimitare il commento e >per terminare l'istruzione SGML. Ora, ho un'idea di dove <![CDATA[... abbia ]]>avuto origine.
Onesimus Nessun impegno specifico

Ho unito il commento.
Joris Timmermans,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.