Jika Anda menggunakan kelas atau pustaka yang sesuai, mereka akan melakukan pelarian untuk Anda. Banyak masalah XML disebabkan oleh penggabungan string.
Karakter XML escape
Hanya ada lima:
" "
' '
< <
> >
& &
Melarikan karakter tergantung pada di mana karakter khusus digunakan.
@ Peracerier, saya mohon Anda tidak menulis kode pelarian XML / HTML Anda sendiri. Gunakan fungsi perpustakaan atau Anda pasti akan melewatkan kasus khusus.
Jason
5
Juga untuk jeda baris Anda perlu menggunakan & # xA; & # xD; dan & # x9; untuk tab, jika Anda memerlukan karakter ini dalam atribut.
radistao
78
Jika Anda akan melakukan Temukan / Ganti ini, ingatlah untuk melakukan & amp; penggantian sebelum yang lain.
Doug
2
@Apakah saya baru saja akan menyebutkan hal yang persis sama - atau semua karakter yang diganti lainnya akan rusak, dan hal-hal seperti "akan diubah menjadi&quot;
Jerry Dodge
5
Dari Wikipedia: "Semua karakter Unicode yang diizinkan dapat direpresentasikan dengan referensi karakter numerik." Jadi ada lebih dari 5.
Dalam dokumen SGML, HTML, dan XML, konstruksi logis yang dikenal sebagai data karakter dan nilai atribut terdiri dari urutan karakter, di mana setiap karakter dapat bermanifestasi secara langsung (mewakili dirinya sendiri), atau dapat diwakili oleh serangkaian karakter yang disebut referensi karakter, di mana ada dua jenis: referensi karakter numerik dan referensi entitas karakter. Artikel ini mencantumkan referensi entitas karakter yang valid dalam dokumen HTML dan XML.
Artikel itu mencantumkan lima entitas XML yang telah ditentukan berikut ini:
Menurut spesifikasi dari World Wide Web Consortium (w3C), ada 5 karakter yang tidak boleh muncul dalam bentuk literalnya dalam dokumen XML , kecuali ketika digunakan sebagai pembatas markup atau dalam komentar, instruksi pemrosesan, atau bagian CDATA . Dalam semua kasus lain, karakter ini harus diganti menggunakan entitas yang sesuai atau referensi numerik sesuai dengan tabel berikut:
Perhatikan bahwa entitas yang disebutkan di atas dapat digunakan juga dalam HTML, dengan pengecualian & apos; , yang diperkenalkan dengan XHTML 1.0 dan tidak dideklarasikan dalam HTML 4. Untuk alasan ini, dan untuk memastikan kompatibilitas retro, spesifikasi XHTML merekomendasikan penggunaan & # 39; sebagai gantinya.
XML mendefenisikan kelima entitas tersebut, tetapi ini TIDAK menentukan bahwa Anda tidak dapat menggunakan salah satu dari lima karakter tersebut dalam bentuk literalnya. <dan & harus melarikan diri ke mana-mana (kecuali CDATA). "dan 'hanya harus lolos dalam nilai atribut, dan hanya jika karakter kutipan yang sesuai adalah sama. Dan> tidak pernah benar-benar harus melarikan diri.
Shaun McCance
3
Seperti ditulis di atas, <> "& 'tidak harus diloloskan ketika digunakan sebagai pembatas markup atau dalam komentar, instruksi pemrosesan, atau bagian CDATA. Yaitu ketika Anda menggunakan <> sebagai tag XML Anda tidak melarikan diri Hal yang sama untuk komentar (apakah Anda akan keluar dari & di baris komentar file XML? Anda tidak perlu, dan XML Anda masih valid jika tidak). Ini jelas ditentukan dalam rekomendasi resmi untuk XML oleh W3C .
Albz
7
@ShaunMcCance >harus diloloskan jika mengikuti ]]dalam konten, kecuali jika itu dimaksudkan untuk menjadi bagian dari ]]>pembatas yang menunjukkan akhir dari bagian CDATA.
Lee D
2
Bukan untuk menjadi ahli nujum, tetapi @Albz salah dalam mengatakan bahwa karakter ini HARUS diutamakan dalam konten. Lihat bagian 2.4 di w3.org/TR/REC-xml/#NT-CharData . Versi TL; DR itu adalah bahwa dalam konten elemen chardata, & amp; dan & lt; harus selalu diberi hak. & Gt; karakter MUNGKIN diberikan, meskipun HARUS ketika muncul dalam string literal "]]>" karena kalau tidak itu akan dibaca sebagai mengakhiri bagian CDATA. Untuk penawaran tunggal dan ganda, Anda dapat melarikan diri jika mau. Itu saja, untuk elemen dalam chardata. Komponen XML lainnya memiliki aturan lain.
skye --- kapten
52
Melarikan karakter berbeda untuk tag dan atribut.
Untuk tag:
< <
> > (only for compatibility, read below)
& &
Karakter ampersand (&) dan braket sudut kiri (<) tidak boleh muncul dalam bentuk literalnya, kecuali bila digunakan sebagai pembatas markup, atau dalam komentar, instruksi pemrosesan, atau bagian CDATA. Jika diperlukan di tempat lain, mereka harus melarikan diri menggunakan referensi karakter numerik atau string "& amp;" dan "& lt;" masing-masing. Braket sudut kanan (>) dapat direpresentasikan menggunakan string "& gt;", dan harus, untuk kompatibilitas, diloloskan dengan menggunakan "& gt;" atau referensi karakter ketika muncul dalam string "]]>" dalam konten, ketika string itu tidak menandai akhir dari bagian CDATA.
Untuk memungkinkan nilai atribut mengandung tanda kutip tunggal dan ganda, karakter apostrof atau tanda kutip tunggal (') dapat direpresentasikan sebagai "& apos;", dan karakter tanda kutip ganda (") sebagai" & quot; ".
Melarikan diri ]]>karena ]]>kecuali ]]>sedang mengakhiri bagian CDATA. (Aturan ini berlaku untuk data karakter secara umum - bahkan di luar bagian CDATA.)
Satu aturan lain yang perlu diperhatikan: ]]>harus diloloskan sebagai ]]>, bahkan ketika tidak ada di bagian CDATA. Cara termudah untuk mencapai yang mungkin untuk selalu melarikan diri >sebagai >.
Michael Kay
Terima kasih, @MichaelKay. Saya telah memasukkan catatan membantu Anda ]]> tetapi memilih untuk memindahkannya ke esoterika daripada menyarankan agar >selalu melarikan diri (yang tidak perlu, seperti yang Anda tahu). Tujuan saya di sini untuk membuat aturan pelolosan XML mudah diingat dan 100% akurat .
kjhughes
Jawaban di atas termasuk diterima satu menyebutkan semua lima karakter harus lolos dalam atribut. Apakah Anda memiliki referensi ke standar XML untuk mendukung apa yang Anda katakan karena jawaban Anda secara logis tampaknya benar?
Roman Susi
1
@RomanSusi: Ya, banyak jawaban lain yang mengandung kesalahan atau generalisasi berlebihan ("Cara aman ...") berdasarkan desas-desus, salah tafsir, atau kesalahpahaman XML BNF resmi. Jawaban saya adalah (a) 100% dibenarkan oleh W3C XML Recommendation; lihat banyak referensi terkait dengan BNF resmi, dan (b) diorganisasikan secara singkat, logis, dan mudah diingat perkembangan persyaratan tersebut.
kjhughes
@RomanSusi: Pernyataan spesifik bahwa "semua lima karakter harus diloloskan di dalam atribut" adalah pedoman yang tidak didukung oleh aturan BNF resmi untuk AttValuedikutip dalam jawaban saya melalui tautan pada 2. Nilai Atribut .
kjhughes
25
Selain lima karakter yang umum dikenal [<,>, &, ", dan '], saya juga akan keluar dari karakter tab vertikal (0x0B). Ini adalah UTF-8 yang valid, tetapi tidak valid XML 1.0, dan bahkan banyak perpustakaan (termasuk libxml2 library sangat portabel (ANSI C) ) melewatkannya dan diam-diam menghasilkan XML yang tidak valid.
"Semua karakter Unicode yang diizinkan dapat diwakili dengan referensi karakter numerik." Sebagai contoh:
中
Sebagian besar karakter kontrol dan rentang Unicode lainnya dikecualikan secara khusus, artinya (saya pikir) mereka tidak dapat terjadi melarikan diri atau langsung:
<company>AT&T</company>
Jawaban:
Jika Anda menggunakan kelas atau pustaka yang sesuai, mereka akan melakukan pelarian untuk Anda. Banyak masalah XML disebabkan oleh penggabungan string.
Karakter XML escape
Hanya ada lima:
Melarikan karakter tergantung pada di mana karakter khusus digunakan.
Contoh-contoh dapat divalidasi di Layanan Validasi Markup W3C .
Teks
Cara aman adalah dengan melepaskan semua lima karakter dalam teks. Namun, ketiga karakter tersebut
"
,'
dan>
tidak perlu melarikan diri dalam teks:Atribut
Cara yang aman adalah melarikan diri kelima karakter dalam atribut. Namun,
>
karakter tidak perlu dilepaskan dalam atribut:The
'
karakter tidak perlu melarikan diri dalam atribut jika kutipan adalah"
:Demikian juga, yang
"
tidak perlu diloloskan dalam atribut jika kutipannya adalah'
:Komentar
Kelima karakter khusus tidak boleh lolos dalam komentar:
CDATA
Kelima karakter khusus tidak boleh lolos di bagian CDATA :
Instruksi pemrosesan
Kelima karakter khusus tidak boleh lolos dalam instruksi pemrosesan XML:
XML vs. HTML
HTML memiliki seperangkat kode pelariannya sendiri yang mencakup lebih banyak karakter.
sumber
"
akan diubah menjadi&quot;
Mungkin ini akan membantu:
Daftar referensi entitas karakter XML dan HTML :
Artikel itu mencantumkan lima entitas XML yang telah ditentukan berikut ini:
sumber
Menurut spesifikasi dari World Wide Web Consortium (w3C), ada 5 karakter yang tidak boleh muncul dalam bentuk literalnya dalam dokumen XML , kecuali ketika digunakan sebagai pembatas markup atau dalam komentar, instruksi pemrosesan, atau bagian CDATA . Dalam semua kasus lain, karakter ini harus diganti menggunakan entitas yang sesuai atau referensi numerik sesuai dengan tabel berikut:
Original CharacterXML entity replacementXML numeric replacement
< < <
> > >
" " "
& & &
' ' '
Perhatikan bahwa entitas yang disebutkan di atas dapat digunakan juga dalam HTML, dengan pengecualian & apos; , yang diperkenalkan dengan XHTML 1.0 dan tidak dideklarasikan dalam HTML 4. Untuk alasan ini, dan untuk memastikan kompatibilitas retro, spesifikasi XHTML merekomendasikan penggunaan & # 39; sebagai gantinya.
sumber
>
harus diloloskan jika mengikuti]]
dalam konten, kecuali jika itu dimaksudkan untuk menjadi bagian dari]]>
pembatas yang menunjukkan akhir dari bagian CDATA.Melarikan karakter berbeda untuk tag dan atribut.
Untuk tag:
Untuk atribut:
Dari Data Karakter dan Markup :
sumber
Baru, jawaban sederhana untuk pertanyaan lama, yang sering diajukan ...
Penyelamatan XML Sederhana (diprioritaskan, 100% selesai)
Selalu (90% penting untuk diingat)
<
sebagai<
kecuali<
yang memulai<tag/>
.&
sebagai&
kecuali&
memulai&entity;
.Nilai Atribut (9% penting untuk diingat)
attr="
'
Kutipan tunggal'
ok dalam tanda kutip ganda."
attr='
"
Kutipan ganda"
ok dalam tanda kutip tunggal.'
"
seperti"
dan'
sebagaimana'
sebaliknya.Komentar , CDATA , dan Petunjuk Pemrosesan (0,9% penting untuk diingat)
<!--
Dalam komentar-->
tidak ada yang harus diloloskan tetapi tidak ada--
string yang diizinkan.<![CDATA[
Di dalam CDATA]]>
tidak ada yang harus diloloskan, tetapi tidak ada]]>
string yang diizinkan.<?PITarget
Dalam PI?>
tidak ada yang harus diloloskan, tetapi tidak ada?>
string yang diizinkan.Esoterica (0,1% penting untuk diingat)
]]>
karena]]>
kecuali]]>
sedang mengakhiri bagian CDATA.(Aturan ini berlaku untuk data karakter secara umum - bahkan di luar bagian CDATA.)
sumber
]]>
harus diloloskan sebagai]]>
, bahkan ketika tidak ada di bagian CDATA. Cara termudah untuk mencapai yang mungkin untuk selalu melarikan diri>
sebagai>
.]]>
tetapi memilih untuk memindahkannya ke esoterika daripada menyarankan agar>
selalu melarikan diri (yang tidak perlu, seperti yang Anda tahu). Tujuan saya di sini untuk membuat aturan pelolosan XML mudah diingat dan 100% akurat .AttValue
dikutip dalam jawaban saya melalui tautan pada 2. Nilai Atribut .Selain lima karakter yang umum dikenal [<,>, &, ", dan '], saya juga akan keluar dari karakter tab vertikal (0x0B). Ini adalah UTF-8 yang valid, tetapi tidak valid XML 1.0, dan bahkan banyak perpustakaan (termasuk libxml2 library sangat portabel (ANSI C) ) melewatkannya dan diam-diam menghasilkan XML yang tidak valid.
sumber
Ringkas dari: XML, Lolos
Ada lima entitas yang telah ditetapkan:
"Semua karakter Unicode yang diizinkan dapat diwakili dengan referensi karakter numerik." Sebagai contoh:
Sebagian besar karakter kontrol dan rentang Unicode lainnya dikecualikan secara khusus, artinya (saya pikir) mereka tidak dapat terjadi melarikan diri atau langsung:
Karakter yang valid dalam XML
sumber
Itu tergantung pada konteksnya. Untuk konten, itu adalah < dan & , dan ]]> (meskipun string tiga bukannya satu karakter).
Untuk nilai atribut, itu adalah < , & , " , dan ' .
Untuk CDATA, ini adalah ]]> .
sumber
Hanya
<
dan&
diharuskan untuk melarikan diri jika mereka akan diperlakukan data karakter dan bukan markup:2.4 Data Karakter dan Markup
sumber