CDATA و کاراکترهای خاص
کاراکترهای ویژه XML، موجودیتها و بخشهای CDATA برای متنهای حاوی کد
مشکل کاراکترهای خاص
در XML پنج کاراکتر معنی خاص دارند: <، >، &، " و '. اگر بخواهید آنها را در متن استفاده کنید، دو راه دارید:
راه ۱: موجودیتها (Entities)
| کاراکتر | موجودیت |
|---|---|
< | < |
> | > |
& | & |
" | " |
' | ' |
<question>آیا 5 < 10 است؟</question>
<company>Johnson & Johnson</company>
راه ۲: بخش CDATA
وقتی متن شما پر از کاراکترهای خاص است (مثلاً قطعه کد جاوااسکریپت یا XML!)، escape کردن همهشان کابوس است. راهحل: بخش CDATA:
<script>
<![CDATA[
function compare(a, b) {
if (a < b && b > 0) {
return "a is smaller";
}
}
]]>
</script>
هر چیزی بین <![CDATA[ و ]]> پارسر نادیده میگیرد — متن خام محسوب میشود!
موجودیتهای عددی
میتوانید هر کاراکتر یونیکد را با کد عددیاش بنویسید:
< → < (دهدهی)
< → < (شانزدهشانزدهی)
® → ® (علامت ثبت)
😀 → 😀 (ایموجی!)
موجودیتهای سفارشی (در DTD)
میتوانید میانبرهای خودتان را تعریف کنید:
<!DOCTYPE message [
<!ENTITY company "شرکت لرنینگ سیتی">
<!ENTITY year "۲۰۲۶">
]>
<message>
خوش آمدید به &company; — &year;
</message>
قوانین مهم CDATA
- داخل CDATA نمیتوانید رشته
]]>را داشته باشید (پایان بخش فرض میشود) - CDATA نمیتواند تودرتو شود
- کامنتها و دستورالعملهای پردازش داخل CDATA بیاثرند
- CDATA جایی از سند باشد که محتوا مجاز است (داخل عنصر)
مثال واقعی: ذخیره کد در XML
<tutorial>
<title>آموزش شرط در جاوااسکریپت</title>
<code><![CDATA[
if (age < 18) {
console.log("نوجوان");
} else if (age >= 18 && age < 60) {
console.log("بزرگسال");
}
]]>
قاعده کلی: برای یک یا دو کاراکتر از موجودیت استفاده کنید؛ برای بلوکهای متنی حاوی کد CDATA بهترین انتخاب است.
یادتان باشد CDATA فقط برای پارسر است — برنامهای که سند را میخواند متن خام را بدون کاراکترهای خاص دریافت میکند. پس هنگام تولید XML از داده کاربر، همچنان باید escape کنید یا از CDATA استفاده کنید تا ساختار سند نشکند.
این مبحث بخشی از دوره آموزش کامل XML است.