XML-Kommentare und "-"

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

XML scheint '-' in Kommentaren nicht zu mögen. Ich habe irgendwo gelesen, dass '-' einige Modi innerhalb der <! ... >Sache umschaltet , aber <!-- -- -- -->(gerade Anzahl von --s) scheinen auch ungültig zu sein. Wenn es sich um ein historisches Merkmal handelt, was ist "pro" Teil davon? ("Contra" Teil ist Unfähigkeit, --in Kommentaren zu haben ).

Was ist der Grund für die Komplikation der Kommentarverarbeitung, indem nicht nur '->' das Ende des Kommentars festgelegt und '-' im Inneren zugelassen wird?

Vi.
quelle

Antworten:

54

Aus dem Normdokument:

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

[Definition: Kommentare können an einer beliebigen Stelle in einem Dokument außerhalb eines anderen Markups angezeigt werden. Darüber hinaus können sie in der Dokumenttypdeklaration an Stellen erscheinen, die von der Grammatik zugelassen werden. Sie sind nicht Teil der Zeichendaten des Dokuments. Ein XML-Prozessor kann, muss aber nicht, dass eine Anwendung den Text von Kommentaren abrufen kann. Aus Kompatibilitätsgründen darf die Zeichenfolge "-" (doppelter Bindestrich) in Kommentaren nicht vorkommen.] Verweise auf Parameterentitäten dürfen in Kommentaren nicht erkannt werden.

asawyer
quelle
"Pro" ist also Kompatibilität mit SGML.
Vi.
2
Ich würde es einen technischen Kompromiss nennen.
Asawyer
9
Dies sollte IMO geändert werden, da wir jetzt CSS-Parameter haben, die mit einem doppelten Bindestrich beginnen und sich in einem Stilattribut in einem SVG-Element befinden können. Das Auskommentieren dieser Elemente beeinträchtigt die Kompatibilität mit dem XML-Standard nur aufgrund eines älteren Formats, das es nicht mehr gibt.
Waruyama
1
Würde das geändert werden könnten! Wie die schmerzhafte Erfahrung mit XML 1.1 zeigt, ist es leider eine Sache, die Spezifikation zu ändern. Leute dazu zu bringen, Parser zu aktualisieren, die vor 20 Jahren geschrieben wurden, ist eine andere. Und die Welt voller Parser zu haben, die verschiedene Versionen des Standards implementieren, wird niemandem helfen.
Michael Kay
46

Vielleicht kann es für jemanden hilfreich sein. Ich hatte ein Problem, dass ich einen Befehlszeilenparameter in XML auskommentieren wollte, der mit - beginnt:

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

so natürlich normal so

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

hat nicht funktioniert, aber ich habe herausgefunden, dass wenn das -durch das UTF-8-Äquivalent ersetzt wird &#x002D;oder &#45;es funktioniert und in Kommentaren toleriert werden kann.

Also in meinem Fall die Saite

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

wird korrekt analysiert und kann Teil von Kommentaren sein.

Natürlich sieht es ein bisschen hässlich aus, aber wenn jemand einen String behalten möchte - als Kommentar in seinem XML - denke ich, dass es immer noch besser als nichts ist.

Daniel
quelle
24
Sie können auch die Escape-Sequenz verwenden, &#45;die die ASCII-Escape-Version ist und etwas kürzer als die Unicode-Version ist.
Drwatsoncode
Heheh, alle beschweren sich, Sie haben eine elegante und offensichtliche Lösung gefunden. Bravo.
Chris Bordeman
32

Es ist eine dieser dummen Regeln in XML, weil es in SGML war und die Leute die Kompatibilität nicht brechen wollten. Warum es in SGML ist, ist unklar: Wahrscheinlich, weil es drei Codezeilen im ursprünglichen Parser gespeichert hat.

Michael Kay
quelle
27

--ist aus Kompatibilitätsgründen mit SGML nicht zulässig. Von On SGML und HTML :

Zwischen dem offenen Trennzeichen der Markup-Deklaration ("<!") Und dem offenen Trennzeichen für Kommentare ("-") ist kein Leerzeichen zulässig, zwischen dem Trennzeichen für das Schließen des Kommentars ("-") und dem Trennzeichen für das Schließen der Markup-Deklaration ("-"). ">"). Ein häufiger Fehler besteht darin, eine Zeichenfolge ("---") in einen Kommentar aufzunehmen. Autoren sollten vermeiden, zwei oder mehr benachbarte Bindestriche in Kommentare einzufügen.

Also in SGML <!und >öffnen und schließen Sie "Markup-Deklarationen" und öffnen und schließen Sie --Kommentare.

RichardTowers
quelle
0

Dieses Problem betrifft früher oder später alle, die Kommentare in XML verwenden möchten, um den nicht benötigten Inhalt zu deaktivieren. Ich hatte mehrere Tage lang große Probleme mit Spring-Kontextkonfigurationen, die nicht geladen werden konnten, ohne eine detaillierte Erklärung dafür zu haben. Das Problem war die Gewohnheit, Inhaltsblöcke wie diesen zu kommentieren:

<value>ABC1</value>
<!-- <value>ABC2</value> -->
<value>ABC3</value>

auskommentiert muss es geändert werden:

<!--
    <value>ABC1</value>
    !-- <value>ABC2</value> --
    <value>ABC3</value>
-->

Die Bindestriche im auskommentierten Block haben das Parsen der gesamten Datei durcheinander gebracht, unabhängig davon, wo sie sich befinden, anstatt ignoriert zu werden.

Faustas
quelle