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

Jawaban:

1356

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:

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

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:

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

Atribut

Cara yang aman adalah melarikan diri kelima karakter dalam atribut. Namun, >karakter tidak perlu dilepaskan dalam atribut:

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

The 'karakter tidak perlu melarikan diri dalam atribut jika kutipan adalah ":

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

Demikian juga, yang "tidak perlu diloloskan dalam atribut jika kutipannya adalah ':

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

Komentar

Kelima karakter khusus tidak boleh lolos dalam komentar:

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

CDATA

Kelima karakter khusus tidak boleh lolos di bagian CDATA :

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

Instruksi pemrosesan

Kelima karakter khusus tidak boleh lolos dalam instruksi pemrosesan XML:

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

XML vs. HTML

HTML memiliki seperangkat kode pelariannya sendiri yang mencakup lebih banyak karakter.

Welbog
sumber
33
@ 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 &quot;akan diubah menjadi&amp;quot;
Jerry Dodge
5
Dari Wikipedia: "Semua karakter Unicode yang diizinkan dapat direpresentasikan dengan referensi karakter numerik." Jadi ada lebih dari 5.
Tim Cooper
93

Mungkin ini akan membantu:

Daftar referensi entitas karakter XML dan HTML :

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:

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

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
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

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.

Albz
sumber
14
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:

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

Untuk atribut:

" &quot;
' &apos;

Dari Data Karakter dan Markup :

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; ".

Peter Bartels
sumber
Ini menyiratkan bahwa untuk atribut hanya tanda kutip yang perlu diloloskan, tetapi itu merupakan tambahan dari tiga karakter lainnya
eug
40

Baru, jawaban sederhana untuk pertanyaan lama, yang sering diajukan ...

Penyelamatan XML Sederhana (diprioritaskan, 100% selesai)

  1. Selalu (90% penting untuk diingat)

    • Melarikan diri <sebagai &lt;kecuali <yang memulai <tag/>.
    • Melarikan diri &sebagai &amp;kecuali &memulai &entity;.
  2. Nilai Atribut (9% penting untuk diingat)

    • attr=" 'Kutipan tunggal 'ok dalam tanda kutip ganda."
    • attr=' "Kutipan ganda "ok dalam tanda kutip tunggal.'
    • Melarikan diri "seperti &quot;dan 'sebagaimana &apos;sebaliknya.
  3. 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.
    • <?PITargetDalam PI ?> tidak ada yang harus diloloskan, tetapi tidak ada ?>string yang diizinkan.
  4. Esoterica (0,1% penting untuk diingat)

    • Melarikan diri ]]>karena ]]&gt;kecuali ]]>sedang mengakhiri bagian CDATA.
      (Aturan ini berlaku untuk data karakter secara umum - bahkan di luar bagian CDATA.)
kjhughes
sumber
Satu aturan lain yang perlu diperhatikan: ]]>harus diloloskan sebagai ]]&gt;, bahkan ketika tidak ada di bagian CDATA. Cara termudah untuk mencapai yang mungkin untuk selalu melarikan diri >sebagai &gt;.
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.

Charon ME
sumber
11

Ringkas dari: XML, Lolos

Ada lima entitas yang telah ditetapkan:

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

"Semua karakter Unicode yang diizinkan dapat diwakili dengan referensi karakter numerik." Sebagai contoh:

&#20013;

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

Tim Cooper
sumber
3

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