صفات و فضاهای نام در XML

25 اردیبهشت 1399
درسنامه درس 4 از سری آموزش XML
XML-04

هر یک از عناصر فایل XML می توانند شامل صفات و ویژگی هایی باشند. این صفات و ویژگی ها (attribute) مقادیری به خود اختصاص می دهند. در قسمت چهارم سری آموزش XML درباره صفات عناصر XML و فضاهای نام در XML مطالبی را ارائه می کنیم.

صفات در XML

عناصر XML نیز مانند عناصر HTML نیز می توانند صفاتی داشته باشند. صفات، طراحی شده اند تا شامل اطلاعاتی راجع به آن عنصر خاص باشند.

صفات عناصر XML باید در کوتیشن قرار گیرند

مقادیر صفات حتما همیشه باید در کوتیشن قرار بگیرند. می توان از کوتیشن (تک کوتیشن '') یا کوتیشن دوگانه (دابل کوتیشن "") استفاده کرد. حالا فرض کنید عنصر با عنوان person به معنای فرد داریم. برای نشان دادن جنسیت فرد می توانیم از فرمتی مانند کد زیر استفاده کنیم:

<person gender="female">

یا به صورت زیر عمل کنیم:

<person gender='female'>

به هر دو شیوه ی استفاده از تک کوتیشن یا استفاده از کوتیشن دوگانه می توان عمل کرد. در مثال بالا gender صفت عنصر person است که این صفت مقداری می گیرد. مقدار داخل کوتیشن یا کوتیشن دوگانه قرار می گیرد.

اگر مقدار صفت یک عنصر، خود دارای کوتیش دوگانه باشد، می توانید برای آن که به مشکلی نخورید از تک کوتیشن برای کل مقدار آن ویژگی استفاده کنید. کد مثال زیر را مشاهده کنید:

<gangster name='George "Shotgun" Ziegler'>

البته می توانید از کاراکترهای خاص مانند آن چه در کد زیر آمده است، بهره ببرید:

<gangster name="George &quot;Shotgun&quot; Ziegler">

مقایسه عناصر و صفات XML

دو کد زیر را مشاهده کنید:

<person gender="female">
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>
<person>
  <gender>female</gender>
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>

در کد مثال اول، gender یا جنسیت به عنوان یک صفت در نظر گرفته شده است. اما در کد مثال بعدی، gender یک عنصر است. هر دو کد بالا اطلاعات یکسانی را برای شما فراهم می کنند. هیچ گونه قانونی وجود ندارد که چه زمانی از صفات و چه زمانی از عناصر در XML استفاده کنید.

راه پیشنهادی ما

به هر کدام از 3 کد مثال زیر، مقداری اطلاعات اضافه شده است:

date در کد مثال اول به صورت یک صفت بکار رفته است:

<note date="2008-01-10">
  <to>Tove</to>
  <from>Jani</from>
</note>

date در کد مثال دوم به صورت یک عنصر یعنی <date>، اضافه شده است:

<note>
  <date>2008-01-10</date>
  <to>Tove</to>
  <from>Jani</from>
</note>

همچنین در کد مثال زیر date را به صورت یک عنصر گسترش یافته بکار برده ایم و راه پیشنهادی ما به همین صورت است:

<note>
  <date>
    <year>2008</year>
    <month>01</month>
    <day>10</day>
  </date>
  <to>Tove</to>
  <from>Jani</from>
</note>

آیا باید از بکار بردن صفات XML خودداری کنیم؟

یک سری از مواردی که هنگام بکار بردن صفات در XML باید مدنظر قرار دهیم، عبارتند از:

  • صفات نمی توانند چند مقدار بگیرند (عناصر می توانند)
  • صفات شامل ساختار درختی نمی شوند (عناصر می شوند)
  • صفات به راحتی قابل گسترش نیستند (جهت تغییراتی که در آینده باید داشته باشند.)

و در نهایت چیزی شبیه کد مثال زیر نسازید:

<note day="10" month="01" year="2008"
to="Tove" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note>

استفاده از صفات به عنوان متادیتا

گاهی اوقات از ID به عنوان یک صفت یا ویژگی عنصری در XML استفاده می کنیم. این ID ها می توانند جهت شناسایی عناصر بکار روند. این کاربرد دقیقا همان کاربرد صفت id در Html است. کد مثال زیر استفاده از ID را برای عنصر XML نشان می دهد:

<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
  </note>
  <note id="502">
    <to>Jani</to>
    <from>Tove</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note>
</messages>

صفت id در کد بالا جهت مشخص ساختن note های مختلف (عنصر note) در فایل XML کاربرد دارد. البته این صفت به خودی خود بخشی از عنصر note محسوب نمی شود (کاربردی مانند عناصر فرزند note ندارد).

آن چیزی که در اینجا می خواهیم بدان اشاره کنیم، مفهوم متادیتاست. متادیتا یعنی اطلاعاتی که راجع به دیتایی می توانیم داشته باشیم. این اطلاعاتی که راجع به دیتاها در اختیار ما قرار می گیرد بخشی از دیتای اصلی محسوب نمی شود و باید به صورت صفت یا ویژگی یک دیتا ذخیره شود و البته همان طور که تا این جا دیده ایم، دیتا خود به صورت عنصر XML ذخیره می گردد.

فضاهای نام در XML

فضاهای نام در XML روشی را جهت جلوگیری از تداخل بین عناصر XML ارائه می کند.

تداخل نام ها

در XML، نام عناصر توسط توسعه دهنده تعریف می شود. در نتیجه در اغلب موارد زمانی که چند فایل XML را از چند برنامه مختلف با یکدیگر ترکیب کنیم، با تداخل رو به رو می شویم.

کد XML زیر شامل اطلاعاتی راجع به جدول HTML می شود:

<table>
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>

در کد XML زیر نیز اطلاعاتی را راجع به جدول دیگری (قطعه ای از لوازم خانه) قرار می دهیم:

<table>
  <name>African Coffee Table</name>
  <width>80</width>
  <length>120</length>
</table>

اگر دو قطعه کد XML بالا به یکدیگر اضافه شوند، یک تداخل نام رخ خواهد داد. هر دو کد XML، عنصری به نام <table> دارند، اما هر کدام یک از این عناصر محتوا و معنای متفاوتی دارند.

یک کاربر یا یک برنامه XML نمی داند این تفاوت ها را چطور باید مدیریت کند.

حل مشکل تداخل نام با استفاده از یک پیشوند

تداخل نام ها در XML به راحتی با استفاده از یک پیشوند نام حل می شود. کد XML زیر اطلاعاتی را راجع به یک جدول HTML شامل می شود و همچنین اطلاعاتی شامل یک قظعه از لوازم خانه (ترکیب دو کد XML بالا):

<h:table>
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table>
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>

در مثال بالا، تداخلی روی نداده است، به این خاطر که دو عنصر <table> نام های متفاوتی دارند (با استفاده از پیشوندی که در نظر گرفته شد).

فضاهای نام در XML - صفت xmlns

زمانی که در XML از پیشوندها استفاده می کنیم، یک فضای نامی برای پیشوند باید تعریف شود. فضای نام را می توان با استفاده از صفت xmlns در تگ آغازین یک عنصر تعریف کرد. سینتکس اعلان فضای نام به این صورت است: " xmlns:prefix="URI. کد زیر را مشاهده کنید:

<root>

<h:table xmlns:h="http://www.w3.org/TR/html4/">
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table xmlns:f="https://www.w3schools.com/furniture">
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>

</root>

شرح مثال بالا:

صفت xmlns در اولین عنصر <table> پیشوند h: prefix را به عنوان یک فضای نام تایید شده ارائه می کند.

صفت xmlns در دومین عنصر <table> پیشوند f: prefix را به عنوان یک فضای نام تایید شده ارائه می کند.

زمانی که فضای نام برای یک عنصر تعریف می شود، همه عناصر فرزند آن عنصر که پیشوند یکسان دارند، با همان فضای نام ارائه هماهنگ هستد و ارائه می شوند. فضای های نام می توانند در عنصر root یک فایل XML اعلان شوند:

<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="https://www.w3schools.com/furniture">

<h:table>
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table>
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>

</root>

توجه: مقدار URI برای یک namespace توسط پارسر استفاده نمی شود و در نتیجه تفسیر و ترجمه نمی گردد. هدف استفاده از URI تعریف یک نام یکتا برای فضای نام است. اما، دلیل آن که برای این مقدار عموما آدرسی از وب استفاده می شود این است که شرکت ها غالبا از فضای نام به عنوان اشاره گر و رفرنسی به یک صفحه وب استفاده می کنند. با این کار یک صفحه وب را که اطلاعاتی درباره آن فضای نام ارائه می کند، در اختیار قرار می دهند. بنابراین در کد بالا با توجه به آدرس های وب ارائه شده می توانید اطلاعاتی را راجع به فضاهای نام اعلان شده بیابید. ضمنا در ادامه به بررسی دقیق URI پرداخته ایم.

شناسه منابع یکسان یا URI

URI که حروف ابتدایی کلمات در عبارت Uniform Resource Identifier را نشان می دهد و به معنای شناسه منابع یکسان است، رشته ای از کاراکترهاست که شناسه ای برای یک منبع خاص در اینترنت معرفی می شود.

متداول ترین URI یا متداول ترین شناسه برای منابع روی اینترنت URL یا Uniform Resource Locator است که آدرس دامنه در اینترنت را مشخص می سازد. یا مثال دیگر آنکه یک نوع URI نه چندان متداول نیز داریم با عنوان URN که از Uniform Resource Name گرفته شده است و به معنای نام منابع یکسان است.

فضاهای نام پیش فرض

تعریف یک فضای نام برای یک عنصر باعث می شود که دیگر نیازی نباشد تا از پیشوندها برای همه عناصر فرزند آن عنصر استفاده کنیم. این کار را می توانیم با استفاده از ساختار زیر انجام دهیم:

xmlns="namespaceURI"

کد مثال زیر را مشاهده کنید. در مثال زیر فایل XML اطلاعاتی را درباره جدول HTML ارائه می کند:

<table xmlns="http://www.w3.org/TR/html4/">
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>

و کد XML زیر نیز اطلاعاتی را درباره یکی از قطعه های لوازم منزل ارائه می کند:

<table xmlns="https://www.w3schools.com/furniture">
  <name>African Coffee Table</name>
  <width>80</width>
  <length>120</length>
</table>

فضاهای نام در XML در کاربرد واقعی

حالا به عنوان یک کاربرد به این می پردازیم که فضاهای نام در XML به جز تداخل در چه جاهایی استفاده کاربردی دارند. XSLT زبانی است که می تواند اسناد XML را به دیگر فرمت ها تبدیل کند. سند XML زیر، فایلی است که جهت تبدیل XML به HTML بکار گرفته می شود. فضای نام "http://www.w3.org/1999/XSL/Transform" مشخص کننده ی عناصر XSLT درون یک سند HTML است. بنابرانی ما می توانیم بگوییم این عنصر چه کاربردی دارد و به چه چیزی مربوط است.

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr>
      <th style="text-align:left">Title</th>
      <th style="text-align:left">Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
  </table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

در رابطه با XSLT در یک بخش جدا مطالب بیشتری را ارائه خواهیم کرد.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش XML توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.