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.


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    >

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.


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


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.)

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.


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


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 ]]> .


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.