Tüm makaleler

XML Entities: XML belgelerinde karakter escape etme

HTML gibi XML de etiketleri işaretlemek için açı ayraçlarını ve ve işaretini (&) kullanır, bu yüzden bu karakterler metin içeriğinde ham haliyle yer alamaz — belge geçerli XML olmaktan çıkar ve tarayıcıların bozuk HTML'i tolere etmesinin aksine, XML ayrıştırıcı sorunu görmezden gelmek yerine hatayla durur.

Zorunlu beş varlık (entity)

Yüzlerce adlandırılmış varlık tanımlayan HTML'in aksine, XML spesifikasyonu yalnızca beşini zorunlu kılar:

  • &lt;< yerine
  • &gt;> yerine
  • &amp;& yerine
  • &apos; — tek tırnak ' yerine
  • &quot; — çift tırnak " yerine

Tırnak işaretlerinin yalnızca öznitelik (attribute) değerleri içinde kaçışlanması gerekir; < ve & ise metin içeriğinin her yerinde kaçışlanmalıdır.

Bu pratikte nerede karşımıza çıkar

Türkiye'nin e-Fatura ve e-Defter sistemleri UBL-TR standardına dayanan XML formatını kullanır, ve içinde & geçen bir şirket adı — "Yılmaz & Ortakları" gibi — kaçışlanmazsa faturanın tamamını geçersiz kılar. Aynı sorun haber sitelerinin RSS beslemelerinde de görülür: kaçışlanmamış bir & içeren tek bir başlık, aboneleri için beslemenin tamamını okunamaz hale getirir.

XML neden HTML'den daha katı

Tarayıcılar genellikle bozuk HTML'i tolere eder ve hatalara rağmen sayfayı göstermeye çalışır. XML ayrıştırıcılar böyle davranmaz: kaçışlanmamış tek bir & veya açı ayracı, tüm belgeyi geçersiz kılar ve işlem hatayla durur.

Ne zaman gerekir

  • Kullanıcıdan gelen metni bir XML belgesine eklemeden önce hazırlamak (besleme, yapılandırma dosyası, SOAP mesajı).
  • Hata ayıklama: alınan bir XML'de varlıkların arkasındaki ham metni görmek.
  • Belge yapısını bozmadan XML dosyalarını elle düzenlemek.

Varlıklara alternatif: CDATA bölümü

Bir metin bloğu çok fazla özel karakter içeriyorsa — XML içine gömülü bir HTML veya kod parçası gibi — onu <![CDATA[...]]> içine sarmak genelde daha pratiktir; bu bölümde < ve & kaçışlanmaya gerek duymadan düz metin olarak işlenir. Tek istisna, CDATA'yı kapatan ve bu yüzden bölümün kendi içeriğinde yer alamayan ]]> dizisidir.

Aracı dene