Wie entkomme ich kaufmännisches Und in XML, damit es in HTML als Entitäten gerendert wird?


523

Ich habe XML-Text, den ich auf einer HTML-Seite rendern möchte. Dieser Text enthält ein kaufmännisches Und, das ich in seiner Entitätsdarstellung rendern möchte : &.

Wie entkomme ich diesem kaufmännischen Und im Quell-XML? Ich habe es versucht &, aber dies wird als das tatsächliche kaufmännische Und-Zeichen ( &) dekodiert , das in HTML ungültig ist .

Ich möchte es also so umgehen, dass es wie &auf der Webseite gerendert wird , die die XML-Ausgabe verwendet.


1
Die Behauptung in der letzten Überarbeitung dieser Frage, dass "das tatsächliche kaufmännische Und-Zeichen (&) ... in HTML ungültig ist". ist falsch. Selbst in der akzeptierten Antwort auf die als Begründung angegebene verknüpfte Frage heißt es: "Mit HTML5 können Sie sie frei lassen, aber nur, wenn die folgenden Daten nicht wie eine gültige Zeichenreferenz aussehen . "
Mark Amery

Antworten:


422

Wenn Ihr XML enthält &, führt dies zum Text &.

Wenn Sie das in HTML verwenden, wird das als gerendert &.


195

Gemäß § 2.4 der XML 1.0 - Spezifikation , sollten Sie in der Lage sein zu verwenden &.

Ich habe versucht & amp; das ist aber nicht erlaubt.

Sind Sie sicher, dass es kein anderes Problem ist? XML definiert dies explizit als den Weg, um kaufmännisches Und zu umgehen.


3
Dies war beim Posten völlig vernünftig, aber Änderungen (oder vielleicht Klarstellungen) an der Frage haben sie seitdem als Antwort unsinnig erscheinen lassen. Zum einen ist die zitierte Passage in der Frage nicht mehr vorhanden.
Mark Amery

132

Das &Zeichen selbst ist ein Escape-Zeichen in XML. Die Lösung besteht darin, es und ein Unicode-Dezimaläquivalent zu verketten, um &sicherzustellen, dass keine XML-Analysefehler vorliegen. Das heißt, ersetzen Sie das Zeichen &durch &.


5
Ich bevorzuge diese Lösung wirklich! Sollte auch möglich sein, die hexadezimale Notation zu verwenden:&
CodeManX

2
Warum sollte das logischerweise funktionieren? Beide Zeichenfolgen haben ein kaufmännisches Und, einschließlich der mit dem Zeichencode am Ende ...
sijpkes

4
@sijpkes Da das kaufmännische Und hier dem Parser mitteilt, dass die folgenden Zeichen verwendet werden, um ein anderes Zeichen darzustellen, das in diesem Fall ein kaufmännisches Und wäre. Ein kaufmännisches Und ist in XML nicht "illegal" - es hat nur eine besondere Bedeutung. Es bedeutet "alle Zeichen danach, bis Sie ein Semikolon treffen, sollten in etwas anderes übersetzt werden". Wenn Sie normalerweise ein kaufmännisches Und ohne die beschreibenden Zeichen und das nachfolgende Semikolon haben, wird der Parser verwirrt.
Riley Major

1
Das ist die Antwort für mich. Hinzufügen von & # 038; am Speicherort meines Antwortheaders wurde das Problem behoben und das kaufmännische Und im Antwortheader wird nicht angezeigt. : D
iamjoshua

Der Stapelüberlauf ist so großartig. Hier ist ein fast 11 Jahre alter Beitrag, der mein Problem löst. Und es wurde über 690.000 Mal angesehen.
Bill

69

Verwenden CDATAtags:

 <![CDATA[
   This is some text with ampersands & other funny characters. >>
 ]]>

4
Dies ist eher eine Vermutung als eine Antwort.
Bryan Oakley

10
Es könnte eine Vermutung sein; es ist jedoch richtig. Mit CDATA-Markern können rohe kaufmännische Und-Zeichen verwendet werden.
Quentin

19
Der ursprüngliche Beitrag hat nie klar gemacht, wo das & verwendet werden soll. CDATA-Tags können nicht für Attributwerte verwendet werden, sondern nur für den tatsächlichen Inhalt der Tags. Daher habe ich das '?'
Scragar

1
Dies eignet sich auch hervorragend zur Charakterisierung von XML-Daten. Diese Antwort ist in vielen anderen Szenarien zum Rendern von XML hilfreich. Für mich hat es in Camel XML DSL wirklich geholfen, als ich den Body oder einen Header mit einigen XML-Daten festlegen musste. Der Camel XML-Parser ignorierte den CDATA-Inhalt und las sie als Zeichenstrom. Ohne dies wirft die Kamelmaschine ungültige XML-Strukturausnahmen aus
Kimutai

1
Dies ist genau die Antwort, die ich brauchte, da ich in meinem Fall nicht sicher bin, welche Zeichen im XML enthalten sein könnten, sodass ich alles in diesem Abschnitt umgehen muss.
Matt


11

In meinem Fall musste ich es ändern %26.

Ich musste &in einer URL entkommen . Also &amp;hat es für mich nicht geklappt. Die Urlencode- Funktion ändert sich &zu %26. Auf diese Weise haben sich weder XML noch der Browser-URL-Mechanismus über die URL beschwert.


8
Ja. Beachten Sie jedoch, dass es beim OP darum ging, in XML zu entkommen. Das Escaping in einer URL ist ein anderes Problem. Der wahre Spaß beginnt, wenn Sie URLs in XML oder XML-Fragmente in URLs haben ...
Oskar Berggren

6

Ich habe & amp ausprobiert, aber es hat nicht funktioniert. Basierend auf der Antwort von Wim ten Brink habe ich & amp; amp ausprobiert und es hat funktioniert.

Einer meiner Entwicklerkollegen schlug mir vor, & # x26; und das funktionierte unabhängig davon, wie oft es gerendert werden kann.


5

&amp; ist die Möglichkeit, ein kaufmännisches Und in den meisten Abschnitten eines XML-Dokuments darzustellen.

Wenn Sie möchten, dass XML in HTML angezeigt wird, müssen Sie zuerst ordnungsgemäß codiertes XML erstellen (was das Ändern &in bedeutet &amp;) und dann verwenden, um ordnungsgemäß codiertes HTML zu erstellen (was das erneute Ändern &in beinhaltet &amp;). Das ergibt:

&amp;amp;

Eine ausführlichere Erläuterung der XML-Codierung finden Sie unter:

Welche Zeichen muss ich in XML-Dokumenten maskieren?


4

<xsl:text disable-output-escaping="yes">&amp;&nbsp;</xsl:text> wird den Trick machen.


3

Wie wäre es mit dem Unicode \u0026? Funktioniert für mich in meinen Android XML-Dateien. Wenn Probleme auftreten, lassen Sie es mich wissen.


1
\uEscapezeichen haben in XML im Allgemeinen keine besondere Bedeutung. -1.
Mark Amery

@MarkAmery Ja, sie haben keine besonderen Bedeutungen, und genau deshalb funktionieren sie so gut - es gibt nichts zu interpretieren, also gibt es nichts, was schief gehen könnte. Der Java interpretiert den Unicode und zeigt ein kaufmännisches Und an, wie es das OP wünscht.
Scott Biggs

1
@ScottBiggs Was hat Java mit der Frage des OP zu tun?
Philippe-André Lorin

1
@ ScottBiggs Also ist es nicht zum Thema. - 1.
Philippe-André Lorin

1
@ScottBiggs Die Tatsache, dass es für Sie funktioniert und dass einige andere davon profitieren können, ist irrelevant. Ihre Antwort ist Lärm für alle anderen Leser. Weil es sich nicht um den allgemeineren Fall handelt, nach dem das OP gefragt hat. Hier geht es nicht darum, Ihren Erfolg nicht zu teilen. Hier geht es darum, es dort zu halten, wo es hingehört. Ihr Beitrag könnte nützlich sein, wird hier jedoch nicht als Antwort präsentiert. Vielleicht als Kommentar, vielleicht als Antwort auf eine andere Frage (die Sie selbst erstellen und beantworten können).
Philippe-André Lorin

0

Überlegen Sie, ob Ihr XML wie folgt aussieht.

<Employees Id="1" Name="ABC">
  <Query>
    SELECT * FROM EMP WHERE ID=1 AND RES<>'GCF'
  <Query>
</Employees>

Sie können das nicht <>direkt verwenden, da es einen Fehler auslöst. In diesem Fall können Sie dies &#60;&#62;ersetzen.

<Employees Id="1" Name="ABC">
  <Query>
    SELECT * FROM EMP WHERE ID=1 AND RES &#60;&#62; 'GCF'
  <Query>
</Employees>

Klicken Sie hier , um alle Codes anzuzeigen.


2
Ich denke, dieser Grund war in den 7 Jahren vor der Veröffentlichung dieser Antwort gut abgedeckt.
miken32
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.