Bagaimana cara keluar dari ampersand di XML sehingga ditampilkan sebagai entitas dalam HTML?

524

Saya memiliki beberapa teks XML yang ingin saya render di halaman HTML. Teks ini berisi ampersand, yang saya ingin membuat dalam representasi entitas yang: &.

Bagaimana cara saya melepaskan ampersand ini dalam XML sumber? Saya mencoba &, tetapi ini diterjemahkan sebagai karakter ampersand yang sebenarnya ( &), yang tidak valid dalam HTML .

Jadi saya ingin menghindarinya sedemikian rupa sehingga akan ditampilkan seperti &pada halaman web yang menggunakan output XML.

AJM
sumber
1
Klaim dalam revisi terbaru dari pertanyaan ini bahwa "karakter ampersand aktual (&) ... tidak valid dalam HTML." itu salah. Memang, bahkan jawaban yang diterima untuk pertanyaan yang ditautkan diberikan sebagai pernyataan justifikasi "HTML5 memungkinkan Anda untuk membiarkannya tidak dihapus, tetapi hanya ketika data yang mengikuti tidak terlihat seperti referensi karakter yang valid" .
Mark Amery

Jawaban:

422

Ketika XML Anda berisi &, ini akan menghasilkan teks &.

Saat Anda menggunakannya dalam HTML, itu akan diterjemahkan sebagai &.

Wim sepuluh Brink
sumber
195

Sesuai §2.4 dari spesifikasi XML 1.0 , Anda harus dapat menggunakannya &.

Saya mencoba & amp; tapi ini tidak diizinkan.

Apakah Anda yakin itu bukan masalah yang berbeda? XML secara eksplisit mendefinisikan ini sebagai cara untuk menghindari ampersand.

John Feminella
sumber
3
Ini sangat masuk akal ketika diposting, tetapi perubahan (atau mungkin klarifikasi) untuk pertanyaan karena membuatnya tampak tidak masuk akal sebagai jawaban. Untuk satu hal, petikan yang dikutip tidak lagi hadir dalam pertanyaan.
Mark Amery
133

The &karakter itu sendiri merupakan karakter escape di XML sehingga solusinya adalah untuk menggabungkan dan desimal Unicode setara untuk &sehingga memastikan bahwa tidak ada XML parsing error. Artinya, ganti karakter &dengan &.

Masalah
sumber
5
Saya sangat suka solusi ini! Seharusnya juga dimungkinkan untuk menggunakan notasi heksadesimal:&
CodeManX
2
Secara logis, mengapa ini bisa berhasil? Kedua string memiliki ampersand, termasuk yang dengan kode karakter di akhir ...
sijpkes
4
@sijpkes Karena ampersand di sini memberi tahu parser bahwa karakter berikut digunakan untuk mewakili karakter lain, yang dalam hal ini adalah ampersand. Ampersand bukan "ilegal" dalam XML-- itu hanya memiliki arti khusus. Ini berarti "semua karakter setelah ini sampai Anda menekan titik koma harus diterjemahkan ke sesuatu yang lain". Ketika Anda memiliki tanda dan biasanya, tanpa karakter deskriptif dan tanda titik koma, pengurai menjadi bingung.
Riley Major
1
Ini jawaban untuk saya. Menambahkan & # 038; di Lokasi Header Respons saya, perbaiki dan tidak menampilkan Ampersand pada Header Respons. : D
iamjoshua
Stack Overflow sangat bagus. Ini adalah postingan yang hampir 11 tahun yang menyelesaikan masalah saya. Dan telah dilihat lebih dari 690.000 kali.
Bill
69

Gunakan CDATAtag:

 <![CDATA[
   This is some text with ampersands & other funny characters. >>
 ]]>
scragar
sumber
4
Ini adalah tebakan daripada jawaban.
Bryan Oakley
10
Mungkin dugaan; itu benar. Marker CDATA memungkinkan ampersand mentah untuk digunakan.
Quentin
19
Posting asli tidak pernah memperjelas di mana & apa yang akan digunakan, tag CDATA tidak dapat digunakan untuk nilai atribut, hanya untuk konten sebenarnya dari tag, maka alasan saya menyertakan '?'.
scragar
1
Ini juga bagus untuk mengkarakterisasi data xml dan jawaban ini sangat membantu dalam banyak skenario lain tentang rendering xml. Bagi saya, itu sangat membantu dalam Camel XML DSL, ketika saya perlu mengatur body atau header dengan beberapa data XML, parser XML Camel mengabaikan konten CDATA, membacanya sebagai aliran karakter. Tanpa ini, mesin unta mengeluarkan pengecualian struktur xml yang tidak valid
Kimutai
1
Ini persis jawaban yang saya butuhkan, karena dalam kasus saya, saya tidak yakin karakter apa yang mungkin muncul dalam XML, jadi saya perlu melarikan diri dari semua yang ada di bagian itu.
Matt
11

Dalam kasus saya, saya harus mengubahnya ke %26.

Saya perlu melarikan diri &dalam URL. Jadi &amp;tidak berhasil untuk saya. Fungsi urlencode berubah &menjadi %26. Dengan cara ini XML atau mekanisme URL browser tidak mengeluh tentang URL.

Serhat Akay
sumber
8
Iya. Perhatikan bahwa OP adalah tentang melarikan diri dalam XML. Melarikan diri dalam URL adalah masalah yang berbeda. Kegembiraan yang sebenarnya dimulai ketika Anda memiliki URL dalam XML, atau XML-fragmen dalam URL ...
Oskar Berggren
6

Saya sudah mencoba & amp, tetapi tidak berhasil. Berdasarkan jawaban Wim ten Brink, saya mencoba & amp dan berhasil.

Salah satu rekan pengembang saya menyarankan saya untuk menggunakan & # x26; dan itu bekerja terlepas dari berapa kali itu dapat diberikan.

mcampos
sumber
5

&amp; adalah cara untuk mewakili ampersand di sebagian besar bagian dokumen XML.

Jika Anda ingin memiliki XML ditampilkan dalam HTML, Anda harus terlebih dahulu membuat dikodekan dengan benar XML (yang melibatkan perubahan &untuk &amp;) dan kemudian menggunakannya untuk membuat dikodekan dengan baik HTML (yang melibatkan lagi mengubah &ke &amp;). Itu menghasilkan:

&amp;amp;

Untuk penjelasan yang lebih menyeluruh tentang penyandian XML, lihat:

Karakter apa yang saya butuhkan untuk melarikan diri dalam dokumen XML?

Riley Major
sumber
4

<xsl:text disable-output-escaping="yes">&amp;&nbsp;</xsl:text> akan melakukan trik.

Rick
sumber
3

Bagaimana dengan menggunakan unicode \u0026? Bekerja untuk saya di file XML android saya. Jika ada masalah, seseorang beri tahu saya.

Scott Biggs
sumber
1
\uescapes tidak memiliki arti khusus dalam XML secara umum. -1.
Mark Amery
@MarkAmery Ya, mereka tidak memiliki arti khusus, itulah sebabnya mereka bekerja sangat baik - tidak ada yang bisa ditafsirkan, jadi tidak ada yang salah. Java menginterpretasikan unicode dan menampilkan ampersand seperti yang diinginkan OP.
Scott Biggs
1
@ScottBiggs Apa hubungan Java dengan pertanyaan OP?
Philippe-André Lorin
1
@ScottBiggs Jadi di luar topik. - 1.
Philippe-André Lorin
1
@ScottBiggs Fakta bahwa itu bekerja untuk Anda, dan bahwa beberapa orang lain mendapat manfaat, tidak relevan; jawaban Anda tidak berisik untuk semua pembaca lainnya. Karena itu tidak berurusan dengan kasus yang lebih umum yang ditanyakan OP. Ini bukan tentang tidak membagikan kesuksesan Anda. Ini tentang menyimpannya di tempatnya. Kontribusi Anda mungkin bermanfaat, tetapi tidak disajikan sebagai jawaban di sini. Mungkin sebagai komentar, mungkin sebagai jawaban untuk pertanyaan lain (yang bebas Anda buat dan jawab sendiri).
Philippe-André Lorin
0

Pertimbangkan apakah XML Anda terlihat seperti di bawah ini.

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

Anda tidak dapat menggunakan <>secara langsung karena ada kesalahan. Dalam hal ini, Anda dapat menggunakannya &#60;&#62;sebagai pengganti.

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

Klik di sini untuk melihat semua kode.

Sarath Avanavu
sumber
2
Saya pikir tanah ini tertutup dengan baik dalam 7 tahun sebelum jawaban ini diposting.
miken32