XML belgelerinde kaçmak için hangi karakterlere ihtiyacım var?


Yanıtlar:


1356

Eğer uygun bir sınıf veya kütüphane kullanırsanız, sizin için kaçmayı yapacaklardır. Birçok XML sorununa dize birleştirme neden olur.

XML çıkış karakterleri

Sadece beş tane var:

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

Kaçan karakterler özel karakterin kullanıldığı yere bağlıdır.

Örnekler W3C İşaretleme Doğrulama Hizmetinde doğrulanabilir .

Metin

Güvenli yol, metindeki beş karakterin hepsinden kaçmaktır. Ancak üç karakter ", 've >ihtiyaç değil metinde öncelenmelidir:

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

Öznitellikler

Güvenli yol, niteliklerdeki beş karakterin hepsinden kaçmaktır. Ancak, >karakterin özniteliklerden kaçmasına gerek yoktur:

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

'Tırnak ise karakter özelliklerinde kaçmış gerek yoktur ":

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

Benzer şekilde, "tırnak işaretleri şöyle ise özelliklerden kaçmak gerekmez ':

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

Yorumlar

Tüm beş özel karakterler olmamalıdır yorumlarda öncelenmelidir:

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

CDATA

Beşi özel karakterler olmamalıdır içinde öncelenmelidir CDATA bölümleri:

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

İşleme talimatları

Tüm beş özel karakterler olmamalıdır XML işleme talimatlarında öncelenmelidir:

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

XML ve HTML

HTML'nin çok daha fazla karakteri kapsayan kendi kaçış kodları kümesi vardır .


33
@Pacerier, kendi XML / HTML çıkış kodunuzu yazmaman için yalvarıyorum. Bir kütüphane işlevi kullanın veya özel bir vakayı kaçırmak zorundasınız.
Jason

5
Ayrıca satır sonları için & # xA; & # xD; ve & # x9; sekmesinde, bir karakterde bu karakterlere ihtiyacınız varsa.
radistao

78
Bunlarda bir Bul / Değiştir yapacaksanız, & amp; diğerlerinden önce değiştirme.
Doug

2
@ Doug Tam olarak aynı şeyden bahsetmek üzereydim - ya da diğer tüm değiştirilen karakterler bozulacak ve benzeri şeyler &quot;değiştirilecek&amp;quot;
Jerry Dodge

5
Wikipedia'dan: "İzin verilen tüm Unicode karakterler sayısal bir karakter başvurusuyla temsil edilebilir." Yani 5'ten çok daha fazlası var
Tim Cooper

93

Belki de bu yardımcı olacaktır:

XML ve HTML karakteri varlık referanslarının listesi :

SGML, HTML ve XML belgelerinde, karakter verileri ve nitelik değerleri olarak bilinen mantıksal yapılar, her karakterin doğrudan tezahür edebileceği (kendini temsil eden) veya karakter referansı adı verilen bir dizi karakterle temsil edilebildiği karakter dizilerinden oluşur. bunlardan iki türü vardır: sayısal karakter başvurusu ve karakter varlığı başvurusu. Bu makalede, HTML ve XML belgelerinde geçerli olan karakter varlığı başvuruları listelenmektedir.

Bu makalede aşağıdaki beş önceden tanımlanmış XML varlığı listelenmiştir:

quot  "
amp   &
apos  '
lt    <
gt    >

73

World Wide Web Konsorsiyumu'nun (w3C) teknik özelliklerine göre, biçimlendirme sınırlayıcıları veya yorum, işleme talimatı veya CDATA bölümü içinde kullanılması dışında, XML belgesinde değişmez formlarında görünmemesi gereken 5 karakter vardır. . Diğer tüm durumlarda, bu karakterlerin aşağıdaki tabloya göre ilgili varlık veya sayısal başvuru kullanılarak değiştirilmesi gerekir:

Original CharacterXML entity replacementXML numeric replacement
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

Yukarıda belirtilen varlıkların & apos; hariç, HTML'de de kullanılabileceğine dikkat edin . , XHTML 1.0 ile tanıtıldı ve HTML 4'te bildirilmedi. Bu nedenle ve geriye dönük uyumluluk sağlamak için XHTML spesifikasyonu & # 39; yerine.


14
XML bu beş varlığı önceden tanımlar, ancak bu beş karakterin hiçbirini gerçek biçiminde kullanamayacağınızı kesinlikle belirtmez. <ve & her yerden kaçılmalıdır (CDATA hariç). "Ve" sadece aslında kaçmış zorundadır asla> nitelik değerleri kaçan lazım, ve karşılık gelen tırnak karakteri aynı olması durumunda Ve..
Shaun McCance

3
Yukarıda yazıldığı gibi, <> "& 'işaretleme sınırlayıcıları olarak kullanıldığında veya bir yorum, işleme talimatı veya bir CDATA bölümünde kullanıldığında, yani <> XML etiketi olarak kullanıldığında kaçmazsınız. bir yorum için. aynı şey (bir kaçacağını & bir XML dosyasının bir yorumladı hattında? sen gerekmez ve eğer yapmazsan XML hala geçerlidir). Bu açıkça belirtilen resmi tavsiyelere W3C XML .
Albz

7
@ShaunMcCance , bir CDATA bölümünün sonunu belirten sınırlayıcının bir parçası olması amaçlanmadıkça içerik içinde >takip ediliyorsa kaçmalıdır . ]]]]>
Lee D

2
Bir büyücü olmak için değil, ama @Albz bu karakterlerin içerikte yetki sahibi OLMASI gerektiğini söylemekte yanlış. W3.org/TR/REC-xml/#NT-CharData adresindeki 2.4 bölümüne bakın . TL; DR sürümü, chardata element içeriğindeki & amp; ve & lt; her zaman yetkilendirilmelidir. & Gt; karakteri, "]]>" sabit dizesinde görünmesi ZORUNLU olmasına rağmen, yetkilendirilebilir çünkü aksi takdirde bu bir CDATA bölümünü sonlandırmak olarak okunur. Tek tırnak ve çift tırnak için isterseniz kaçabilirsiniz. Elemanlar içindeki chardata için bu kadar. XML'in diğer bileşenlerinin başka kuralları vardır.
skye --- kaptan

52

Kaçan karakterler etiketler ve özellikler için farklıdır.

Etiketler için:

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

Özellikler için:

" &quot;
' &apos;

Gönderen Karakter Veriler ve İşaretleme :

Ve işareti karakteri (&) ve sol açılı ayraç (<), biçimlendirme sınırlayıcılar olarak veya bir yorum, işleme talimatı veya bir CDATA bölümü dahilinde kullanıldığı durumlar dışında, tam anlamıyla görünmemelidir. Başka bir yerde ihtiyaç duyulursa, ya sayısal karakter referansları ya da sırasıyla "& amp;" ve "<lt" dizeleri kullanılarak kaçılmalıdır. Sağ açılı ayraç (>), "& gt;" dizesi kullanılarak temsil edilebilir ve uyumluluk için içerikte "& gt;" veya bir karakter başvurusu kullanılarak ">]>>" dizesinde göründüğünde, bu dize bir CDATA bölümünün sonunu işaretlemiyorsa.

Özellik değerlerinin hem tek hem de çift tırnak içermesine izin vermek için kesme işareti veya tek tırnak karakteri (') "&"; çift tırnak karakteri (")" & quot; ".


Bu, öznitelikler için yalnızca tırnaklardan
kaçılması

40

Eski, sık sorulan bir soruya yeni, basitleştirilmiş cevap ...

Basitleştirilmiş XML Çıkışı (öncelikli,% 100 tamamlandı)

  1. Her zaman (hatırlanması% 90 önemli)

    • Kaçış <olarak &lt;sürece <başlangıç edilir <tag/>.
    • Kaçış &olarak &amp;sürece &bir başlıyor &entity;.
  2. Özellik Değerleri (hatırlanması gereken% 9 önemli)

    • attr=" 'Tek tırnak 'çift ​​tırnak içinde tamam."
    • attr=' "Çift tırnak "tek tırnak içinde tamam.'
    • Kaçış "olarak &quot;ve 'sıra &apos;aksi.
  3. Yorumlar , CDATA ve İşleme Talimatları (hatırlanması gereken% 0.9 önemli)

    • <!--Yorumların içinde -->hiçbir şeyden kaçınmak zorunda değildir, ancak --dizeye izin verilmez.
    • <![CDATA[CDATA içinde ]]>hiçbir şeyden kaçınmak zorunda değildir, ancak ]]>dizelere izin verilmez.
    • <?PITargetİçinde PI'lerin ?> şey kaçmış olması gerekir, ancak hiçbir ?>dizeleri izin verilir.
  4. Ezoterik (hatırlanması gereken% 0.1 önemli)

    • Kaçış ]]>olarak ]]&gt;sürece ]]>CDATA bölümü sona eriyor.
      (Bu kural genel olarak karakter verileri için geçerlidir - CDATA bölümünün dışında bile.)

Belirterek bir diğer kural değer: ]]>kaçılması gereklidir ]]&gt;bile değil bir CDATA bölümü. Bunu başarmanın en kolay yolu her zaman> olduğu gibi kaçmak olabilir &gt;.
Michael Kay

Teşekkürler, @MichaelKay. Hakkında yararlı not dahil ettik ]]> ama > her zaman kaçtı (ki bildiğiniz gibi olması gerekmez) önermek yerine esoterica için onu temsil etmeyi seçti . Buradaki amacım XML'den kaçan kuralları kolayca hatırlamak ve % 100 doğru yapmak .
kjhughes

Kabul edilen bir cevap dahil olmak üzere yukarıdaki cevaplar, beş karakterin hepsinden de kaçınılmalıdır. Yanıtınız mantıklı olarak doğru gibi göründüğü için söylediklerinizi desteklemek için XML standardına referansınız var mı?
Roman Susi

1
@RomanSusi: Evet, diğer pek çok yanıt, resmi XML BNF'nin duyulmasına, yanlış yorumlanmasına veya yanlış anlaşılmasına dayanan hatalar veya aşırı genelleştirmeler ("Güvenli yol ...") içeriyor. Cevabım (a)% 100 W3C XML Öneri tarafından haklı çıkar; resmi BNF'ye bağlı birçok referansa bakın ve (b) bu ​​gereksinimlerin kısa, mantıklı ve kolay hatırlanan bir şekilde düzenlenmesi.
kjhughes

@RomanSusi: "Beş karakterin hepsi öznitelikler içinde kaçmalı" ifadesi AttValue, 2. Öznitelik Değerleri bağlantısını kullanarak cevabımda atıfta bulunulan resmi BNF kuralı tarafından desteklenmeyen özensiz rehberliktir .
kjhughes

25

Yaygın olarak bilinen beş karaktere [<,>, &, "ve '] ek olarak, dikey sekme karakterinden (0x0B) de kaçarım. Geçerli UTF-8, ancak geçerli XML 1.0 ve hatta birçok kütüphane değil (son derece portatif (ANSI C) kitaplığı libxml2 dahil ) onu özlüyor ve sessizce geçersiz XML çıktısı veriyor.


11

Kısaltılmış: XML, Kaçan

Önceden tanımlanmış beş varlık vardır:

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

"İzin verilen tüm Unicode karakterler sayısal bir karakter başvurusuyla temsil edilebilir." Örneğin:

&#20013;

Kontrol karakterlerinin ve diğer Unicode aralıklarının çoğu özellikle hariç tutulur, yani (bence) kaçar veya doğrudan gerçekleşemezler:

XML'deki geçerli karakterler


3

Bu koşullara bağlıdır. İçerik için < ve & , ve ]]> (bir karakter yerine üç dize olsa da).

Özellik değerleri için < , & , " ve 'şeklindedir .

CDATA için ]]> .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.