فضاهای نام XML
مشکل تداخل نام در XML و حل آن با Namespace و پیشوندها
مشکل تداخل نام
وقتی دو سند XML را با هم ترکیب میکنیم، ممکن است عنصری با نام یکسان اما معنای متفاوت وجود داشته باشد. مثال کلاسیک:
<!-- از سند اول: table یعنی جدول مبلمان -->
<table>
<name>میز چوبی</name>
<width>80</width>
<length>120</length>
</table>
<!-- از سند دوم: table یعنی جدول داده -->
<table>
<tr>
<td>سیب</td>
<td>پرتقال</td>
</tr>
</table>
اگر این دو در یک سند کنار هم بیایند، تداخل نام (Name Conflict) رخ میدهد: دو عنصر <table> با معناهای کاملاً متفاوت!
راهحل: پیشوند + فضای نام
با استفاده از پیشوند (Prefix) و اعلان xmlns تداخل را حل میکنیم:
<root>
<!-- جدول مبلمان با پیشوند h -->
<h:table xmlns:h="https://www.w3schools.com/furniture">
<h:name>میز چوبی</h:name>
<h:width>80</h:width>
</h:table>
<!-- جدول داده با پیشوند f -->
<f:table xmlns:f="https://www.w3schools.com/furniture/data">
<f:tr>
<f:td>سیب</f:td>
<f:td>پرتقال</f:td>
</f:tr>
</f:table>
</root>
xmlns چگونه کار میکند؟
سینتکس اعلان فضای نام:
xmlns:پیشوند="URI"
- پیشوند: برچسب کوتاهی که به عنصرها اضافه میشود (مثل
h:) - URI: شناسه یکتای فضای نام — معمولاً یک URL
نکته مهم: URI فضای نام لازم نیست به صفحه واقعی اشاره کند! پارسر هرگز به آن آدرس نمیرود. URI فقط یک رشته یکتا برای تمایز فضاهای نام است. اما معمولاً URL انتخاب میشود چون یکتایی آن تضمینشده است.
اعلان در عنصر ریشه
معمولاً فضاهای نام را در عنصر ریشه اعلان میکنند تا برای کل سند اعمال شود:
<root xmlns:h="https://example.com/html" xmlns:f="https://example.com/furniture">
<h:table>...</h:table>
<f:table>...</f:table>
</root>
فضای نام پیشفرض (Default Namespace)
اگر نمیخواهید به همه عناصر پیشوند بدهید، فضای نام پیشفرض تعریف کنید — بدون پیشوند:
<table xmlns="https://www.w3schools.com/furniture">
<name>میز چوبی</name>
<width>80</width>
</table>
اینجا همه عناصر (و فرزندانشان) به فضای نام پیشفرض تعلق دارند.
مثال واقعی: XHTML + MathML
یک سند که هم HTML دارد و هم فرمول ریاضی MathML:
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<p>فرمول ریاضی:</p>
<math xmlns="http://www.w3.org/1998/Math/MathML">
<mi>x</mi><mo>=</mo><mn>2</mn>
</math>
</body>
</html>
قوانین فضای نام
- پیشوند میتواند هر نام معتبری باشد، اما نباید
xml،xmlnsیا شروع با اینها باشد (رزروشده) - URI میتواند URL یا URN باشد
- اعلان فضای نام روی عنصر و تمام فرزندانش اعمال میشود
- یک عنصر میتواند همزمان از چند فضای نام استفاده کند
فضاهای نام در فناوریهایی مثل XSLT، SOAP، SVG و XHTML همهجا حضور دارند. اگر روزی با اینها کار کردید، حالا میدانید آن
xmlnsهای عجیب در ابتدای فایلها یعنی چه!این مبحث بخشی از دوره آموزش کامل XML است.