Dlaczego komentarz XML nie może zawierać dwóch łączników

16

Stosowałem komentarze przeceny w komentarzach xml pliku konfiguracyjnego, gdy XmlParser zgłosił, że dwa łączniki ( --) nie są dozwolone w komentarzach xml.

Sprawdzając specyfikację XML , wydaje się, że komentarz xml nie został zaprojektowany tak, aby zawierał dwa łączniki ze względu na kompatybilność z parserami SGML.

Dlaczego parsery SGML nie pozwalają na podwójne myślniki w komentarzach?

Onesimus Bez ograniczeń
źródło
2
Nie sądzę, że uzyskasz lepszą odpowiedź niż „bo tak mówi standard”
jk.
Cóż, to jest jedyna odpowiedź, więc nie mam wyboru :-(, choć może być lepsza odpowiedź niż to.
OnesimusUnbound

Odpowiedzi:

30

Ta strona przedstawia sporo historii HTML / SGML i dość skomplikowane reguły tych dwóch następujących po sobie łączników (podwójny myślnik).

Odpowiednia część o SGML:

Krótko mówiąc, podwójny myślnik na początku i na końcu komentarza nie rozpoczyna i nie kończy komentarza. Podwójny myślnik wskazuje zmianę zawartości tego komentarza. Pierwszy - uruchamia komentarz i informuje przeglądarkę, że komentarz może zawierać> znaki bez kończenia komentarza. Drugi - nie kończy komentarza. Mówi przeglądarce, że jeśli napotka> znak, musi zakończyć komentarz. Jeśli zostanie dodany inny -, to wróci do> znaków.

Joris Timmermans
źródło
7
Sekcja, do której się odwołujesz . Kiedy czytam, do czego służy specyfikacja SGML --w komentarzu, moja głowa obraca się wokół złożoności, którą wprowadzi później.
Onesimus Bez ograniczeń
1
Rada, której nigdy nie należy używać --w komentarzu, wydaje mi się dobra. Ale czy istnieje standardowy sposób na ucieczkę? Załóżmy, że chcę utworzyć (i udostępnić) filtr wyjściowy, aby upewnić się, foo -- barże nigdy nie spowoduje problemu. Czy istnieje odpowiednik SGML foo -\- bar? (Jestem pewien, że to nie jest odwrotny ukośnik!) Lub -(zobacz tę odpowiedź ) lub coś innego? Jeśli po prostu zastąpić --z -lub - -, Cytowanie nie jest odwracalny.
etap
12

Ponieważ podwójny łącznik jest ogranicznikiem komentarza w SGML. <!Zaczyna dyspozycję SGMLu --wskazuje komentarz. Zasadniczo z tego samego powodu komentarz C ++ nie może zawierać */.

Jörg W Mittag
źródło
1
Myślę, że -->to separator komentarzy.
Onesimus Bez ograniczeń
10
Nie, nie jest. <!uruchamia instrukcję SGML, >kończy ją. W instrukcji SGML --zarówno rozpoczyna, jak i kończy komentarz.
Jörg W Mittag
7
Ahh dodaj swój komentarz do odpowiedzi, jest to pouczające, ponieważ oznacza, że ​​możesz napisać <! SomeRelevantSgmlTag - komentarz - someAttribute = "blabla" - kolejny komentarz -> a znaczenie semantyczne byłoby <! SomeRelevantSgmlTag someAttribute = " blabla ">
Jimmy Hoffa
1
Ach, to ma sens. --> to tak naprawdę dwa tokeny, --aby oddzielić komentarz i >zakończyć instrukcję SGML. Teraz mam pomysł, skąd <![CDATA[... ]]>pochodzi.
Onesimus Bez ograniczeń
Połączyłem komentarz.
Joris Timmermans