Welche Zeichen muss ich in XML-Dokumenten maskieren?

Antworten:

1356

Wenn Sie eine geeignete Klasse oder Bibliothek verwenden, übernehmen diese die Flucht für Sie. Viele XML-Probleme werden durch die Verkettung von Zeichenfolgen verursacht.

XML-Escapezeichen

Es gibt nur fünf:

"   "
'   '
<   &lt;
>   &gt;
&   &amp;

Das Escapezeichen hängt davon ab, wo das Sonderzeichen verwendet wird.

Die Beispiele können beim W3C Markup Validation Service validiert werden .

Text

Der sichere Weg besteht darin, alle fünf Zeichen im Text zu maskieren. Allerdings sind die drei Zeichen ", 'und >müssen nicht in Text entwertet werden:

<?xml version="1.0"?>
<valid>"'></valid>

Attribute

Der sichere Weg besteht darin, alle fünf Zeichen in Attributen zu maskieren. Das >Zeichen muss jedoch nicht in Attributen maskiert werden:

<?xml version="1.0"?>
<valid attribute=">"/>

Das 'Zeichen muss nicht in Attributen maskiert werden, wenn die Anführungszeichen lauten ":

<?xml version="1.0"?>
<valid attribute="'"/>

Ebenso muss das "nicht in Attributen maskiert werden, wenn die Anführungszeichen sind ':

<?xml version="1.0"?>
<valid attribute='"'/>

Bemerkungen

Alle fünf Sonderzeichen dürfen in Kommentaren nicht maskiert werden:

<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>

CDATA

Alle fünf Sonderzeichen dürfen in CDATA- Abschnitten nicht maskiert werden:

<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>

Verarbeitungsanweisungen

Alle fünf Sonderzeichen dürfen in XML-Verarbeitungsanweisungen nicht maskiert werden:

<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>

XML vs. HTML

HTML verfügt über einen eigenen Satz von Escape-Codes, die viel mehr Zeichen enthalten.

Welbog
quelle
33
@ Pacerier, ich bitte Sie, keinen eigenen XML / HTML-Escape-Code zu schreiben. Verwenden Sie eine Bibliotheksfunktion, oder Sie werden einen Sonderfall verpassen.
Jason
5
Auch für Zeilenumbrüche müssen Sie & # xA; & # xD; und & # x9; für Registerkarte, wenn Sie diese Zeichen in einem Attribut benötigen.
Radistao
78
Wenn Sie diese suchen / ersetzen möchten, denken Sie daran, die & amp; Ersatz vor den anderen.
Doug
2
@ Doug Ich wollte gerade genau das Gleiche erwähnen - sonst werden alle anderen ersetzten Charaktere beschädigt und Dinge wie &quot;werden geändert in&amp;quot;
Jerry Dodge
5
Aus Wikipedia: "Alle zulässigen Unicode-Zeichen können mit einer numerischen Zeichenreferenz dargestellt werden." Es gibt also viel mehr als 5.
Tim Cooper
93

Vielleicht hilft das:

Liste der Entitätsreferenzen für XML- und HTML-Zeichen :

In SGML-, HTML- und XML-Dokumenten bestehen die als Zeichendaten und Attributwerte bekannten logischen Konstrukte aus Zeichenfolgen, in denen sich jedes Zeichen direkt manifestieren (sich selbst darstellen) oder durch eine Reihe von Zeichen dargestellt werden kann, die als Zeichenreferenz bezeichnet werden. Davon gibt es zwei Typen: eine numerische Zeichenreferenz und eine Zeichenentitätsreferenz. Dieser Artikel listet die Zeichenentitätsreferenzen auf, die in HTML- und XML-Dokumenten gültig sind.

In diesem Artikel werden die folgenden fünf vordefinierten XML-Entitäten aufgeführt:

quot  "
amp   &
apos  '
lt    <
gt    >
Andrew Hare
quelle
73

Gemäß den Spezifikationen des World Wide Web Consortium (w3C) dürfen in einem XML-Dokument 5 Zeichen nicht in ihrer wörtlichen Form erscheinen , es sei denn, sie werden als Markup-Begrenzer oder in einem Kommentar, einer Verarbeitungsanweisung oder einem CDATA-Abschnitt verwendet . In allen anderen Fällen müssen diese Zeichen entweder durch die entsprechende Entität oder die numerische Referenz gemäß der folgenden Tabelle ersetzt werden:

Original CharacterXML entity replacementXML numeric replacement
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

Beachten Sie, dass die oben genannten Entitäten mit Ausnahme von & apos; auch in HTML verwendet werden können. , das mit XHTML 1.0 eingeführt wurde und in HTML 4 nicht deklariert ist. Aus diesem Grund und um die Retro-Kompatibilität zu gewährleisten, empfiehlt die XHTML-Spezifikation die Verwendung von & # 39; stattdessen.

Albz
quelle
14
XML definiert diese fünf Entitäten vor, gibt jedoch NICHT an, dass Sie keines dieser fünf Zeichen in ihrer Literalform verwenden können. <und & müssen überall maskiert werden (außer CDATA). "und 'müssen nur in Attributwerten maskiert werden, und nur, wenn das entsprechende Anführungszeichen dasselbe ist. Und> muss eigentlich nie
maskiert
3
Wie oben beschrieben, muss <> "& 'nicht maskiert werden, wenn es als Markup-Begrenzer oder in einem Kommentar, einer Verarbeitungsanweisung oder einem CDATA-Abschnitt verwendet wird. Wenn Sie also <> als XML-Tag verwenden, wird es nicht maskiert Gleiches gilt für einen Kommentar (würden Sie einem & in einer kommentierten Zeile einer XML-Datei entkommen? Sie müssen dies nicht tun, und Ihr XML ist weiterhin gültig, wenn Sie dies nicht tun). Dies ist in den offiziellen Empfehlungen für eindeutig angegeben XML von W3C .
Albz
7
@ShaunMcCance >muss maskiert werden, wenn es ]]innerhalb des Inhalts folgt , es sei denn, es soll Teil des ]]>Trennzeichens sein, das das Ende eines CDATA-Abschnitts angibt.
Lee D
2
Nicht um ein Nekromant zu sein, aber @Albz sagt zu Unrecht, dass diese Zeichen inhaltlich berechtigt sein MÜSSEN. Siehe Abschnitt 2.4 unter w3.org/TR/REC-xml/#NT-CharData . Die TL; DR-Version davon ist die in Chardata-Elementinhalten & amp; und & lt; müssen immer berechtigt sein. Die & gt; Das Zeichen KANN berechtigt sein, obwohl es sein MUSS, wenn es in der Literalzeichenfolge "]]>" erscheint, da dies sonst als Ende eines CDATA-Abschnitts gelesen wird. Bei einfachen und doppelten Anführungszeichen können Sie entkommen, wenn Sie möchten. Das war's für Chardata innerhalb von Elementen. Andere XML-Komponenten haben andere Regeln.
Skye --- Kapitän
52

Das Escaping von Zeichen unterscheidet sich für Tags und Attribute.

Für Tags:

 < &lt;
 > &gt; (only for compatibility, read below)
 & &amp;

Für Attribute:

" &quot;
' &apos;

Aus Zeichendaten und Markup :

Das kaufmännische Und-Zeichen (&) und die linke spitze Klammer (<) dürfen nicht in ihrer wörtlichen Form erscheinen, es sei denn, sie werden als Markup-Begrenzer oder in einem Kommentar, einer Verarbeitungsanweisung oder einem CDATA-Abschnitt verwendet. Wenn sie an anderer Stelle benötigt werden, müssen sie entweder mit numerischen Zeichenreferenzen oder mit den Zeichenfolgen "& amp;" bzw. "& lt;" maskiert werden. Die rechtwinklige Klammer (>) kann mit der Zeichenfolge "& gt;" dargestellt werden und muss aus Kompatibilitätsgründen entweder mit "& gt;" oder einer Zeichenreferenz maskiert werden, wenn sie in der Zeichenfolge "]]>" im Inhalt erscheint. wenn diese Zeichenfolge nicht das Ende eines CDATA-Abschnitts markiert.

Damit Attributwerte sowohl einfache als auch doppelte Anführungszeichen enthalten können, kann das Apostroph- oder einfache Anführungszeichen (') als "& apos;" und das doppelte Anführungszeichen (") als" & quot; ".

Peter Bartels
quelle
Dies impliziert, dass für Attribute nur Anführungszeichen
maskiert
40

Neue, vereinfachte Antwort auf eine alte, häufig gestellte Frage ...

Vereinfachtes XML-Escaping (priorisiert, 100% vollständig)

  1. Immer (90% wichtig zu merken)

    • Entfliehen Sie, <als &lt;ob <a <tag/>.
    • Entkommen , &wie &amp;es sei denn , &wird ein Ausgang &entity;.
  2. Attributwerte (9% wichtig zu beachten)

    • attr=" 'Einfache Anführungszeichen 'sind in doppelten Anführungszeichen in Ordnung."
    • attr=' "Doppelte Anführungszeichen "sind in einfachen Anführungszeichen in Ordnung.'
    • Entkomme "wie &quot;und 'wie &apos;sonst.
  3. Kommentare , CDATA und Verarbeitungsanweisungen (0,9% wichtig zu beachten)

    • <!--Innerhalb von Kommentaren muss --> nichts maskiert werden, aber es sind keine --Zeichenfolgen zulässig.
    • <![CDATA[Innerhalb von CDATA muss ]]> nichts maskiert werden, aber es sind keine ]]>Zeichenfolgen zulässig.
    • <?PITargetInnerhalb von PIs muss ?> nichts maskiert werden, aber es sind keine ?>Zeichenfolgen zulässig.
  4. Esoterik (0,1% wichtig zu beachten)

    • Escape ]]>als ]]&gt;es ]]>sei denn , ein CDATA-Abschnitt wird beendet.
      (Diese Regel gilt für Zeichendaten im Allgemeinen - auch außerhalb eines CDATA-Abschnitts.)
kjhughes
quelle
Eine weitere erwähnenswerte Regel: ]]>muss als maskiert werden ]]&gt;, auch wenn sie sich nicht in einem CDATA-Abschnitt befindet. Der einfachste Weg, dies zu erreichen, besteht darin, immer> als zu entkommen &gt;.
Michael Kay
Danke, @MichaelKay. Ich habe Ihre hilfreiche Notiz über aufgenommen ]]> , mich aber dafür entschieden, sie in die Esoterik zu verbannen, anstatt vorzuschlagen, dass sie > immer entkommen soll (was, wie Sie wissen, nicht sein muss). Mein Ziel hier ist es, die XML-Escape-Regeln leicht zu merken und 100% genau zu machen .
kjhughes
Die obigen Antworten, einschließlich einer akzeptierten Erwähnung aller fünf Zeichen, sollten innerhalb von Attributen maskiert werden. Haben Sie einen Verweis auf den XML-Standard, um zu unterstützen, was Sie sagen, da Ihre Antwort logischerweise die richtige zu sein scheint?
Roman Susi
1
@RomanSusi: Ja, viele andere Antworten enthalten Fehler oder Übergeneralisierungen ("Der sichere Weg ..."), die auf Hörensagen, Fehlinterpretationen oder Missverständnissen des offiziellen XML-BNF beruhen. Meine Antwort ist (a) zu 100% durch die W3C-XML-Empfehlung gerechtfertigt; siehe die vielen verknüpften Verweise auf die offizielle BNF und (b) organisiert in einer präzisen, logischen und leicht zu merkenden Abfolge dieser Anforderungen.
Kjhughes
@RomanSusi: Die spezifische Aussage, dass "alle fünf Zeichen innerhalb von Attributen maskiert werden sollten", ist eine schlampige Anleitung, die von der offiziellen BNF-Regel nicht unterstützt wird, die AttValuein meiner Antwort über einen Link auf 2. Attributwerte zitiert wird .
Kjhughes
25

Zusätzlich zu den allgemein bekannten fünf Zeichen [<,>, &, "und '] würde ich auch das vertikale Tabulatorzeichen (0x0B) umgehen. Es ist gültiges UTF-8, aber kein gültiges XML 1.0 und sogar viele Bibliotheken (einschließlich der hoch portablen (ANSI C) Bibliothek libxml2 ) vermissen es und geben stillschweigend ungültiges XML aus.

Charon ME
quelle
11

Auszug aus: XML, Escaping

Es gibt fünf vordefinierte Entitäten:

&lt; represents "<"
&gt; represents ">"
&amp; represents "&"
&apos; represents '
&quot; represents "

"Alle zulässigen Unicode-Zeichen können mit einer numerischen Zeichenreferenz dargestellt werden." Zum Beispiel:

&#20013;

Die meisten Steuerzeichen und anderen Unicode-Bereiche sind ausdrücklich ausgeschlossen, was bedeutet (glaube ich), dass sie weder maskiert noch direkt auftreten können:

Gültige Zeichen in XML

Tim Cooper
quelle
3

Das hängt vom Kontext ab. Für den Inhalt ist es < und & und ]]> (obwohl eine Zeichenfolge aus drei statt einem Zeichen).

Für Attributwerte ist es < , & , " und ' .

Für CDATA ist es ]]> .

把 友情 留 在 无 无
quelle