XML Document Object Model

دات نت دارای کلاس‌هایی برای خواندن و دستکاری فایل‌های XML می‌باشد. این کلاسها در فضای نامی System.Xml قرار دارند. دات نت از XML Document Object Model استفاده می‌کند که شامل مجموعه‌ای از کلاس‌ها برای نمایش قسمت‌های مختلف یک سند XML می‌باشد. در زیر نام برخی از این کلاس‌ها ذکر شده است :

کلاس توضیح
XmlNode نشان دهنده یک گره در سند XML می‌باشد. هر چیزی که در داخل یک فایل XML می‌بینید مانند خواص عناصر، توضیحات و حتی فضاهای خالی یک گره می‌باشند. این کلاس، کلاس پایه دیگر کلاس‌های XML DOM می‌باشد.
XmlDocument نشان دهنده یک سند واقعی XML می‌باشد که می‌تواند در بارگذاری یا ذخیره یک فایل XML مورد استفاده قرار گیرد.
XmlElement یک عنصر XML را نمایش می‌دهد.
XmlAttribute یک صفت XML را نمایش می‌دهد.
XmlText متن داخل یک عنصر XML را نمایش می‌دهد.
XmlComment یک توضیح XML را نمایش می‌دهد.

یک سند XML نماینده یک کلاس XmlDocument می‌باشد، که می‌توانید آن را خوانده و دستکاری نمایید. سند XML باید با یک عنصر اصلی شروع شود. در داخل این عنصر اصلی فرزندهای آن قرار دارند. شما باید با مفهوم گره‌های پدر و فرزند عناصر آشنا شوید. یک گره پدر شامل گره‌های فرزند می‌باشد. به عنوان مثال به عنصر زیر که شامل چندین عنصر است توجه کنید :

<Product>
   <ProductID>001</ProductID>
   <ProductName>Shampoo</ProductName>
   <Price>10</Price>
</Product>

Product در مثال بالا گره پدر محسوب می‌شود. این گره شامل گره‌هایی مانند ProductID ،ProductName و Price می‌باشد که فرزندان آن به حساب می‌آیند. اگر به عنوان مثال گره ProductName نیز دارای گره‌هایی در داخل خود باشد، خود ProductName یک گره پدر می‌شود، یعنی این گره دو نقش دارد: یکی فرزند گره Product و دیگری پدر گره‌هایی که در داخل آن قرار دارند. اجازه دهید به توضیح برخی از خواص و متدهای این کلاس‌ها بپردازیم.

XmlNode

XmlNode نشان دهنده همه قسمت‌های XML بوده و کلاس پایه دیگر کلاس‌های XML DOM می‌باشد. به عنوان مثال کلاس XmlElement از XmlNode مشتق شده و دارای خواص و متدهای آن می‌باشد. در زیر برخی از خواص کلاس پایه XmlNode آمده است :

خصوصیت توضیح
Attributes مجموعه‌ای از اشیاء XmlAttribute که نماینده صفات گره هستند.
ChildNodes لیستی از گره‌هایی که فرزند گره مورد نظر ما هستند را بر می‌گرداند.
FirstChild اولین گره فرزند، گره جاری را بر می‌گرداند.
HasChildNodes می‌گوید که آیا گره مورد نظر ما گره فرزند دارد یا نه؟
InnerText متن همه گره‌های فرزند، گره مورد نظر را به صورت یک رشته ترکیب و نمایش می‌دهد.
InnerXml رشته XML ی که بین دو تگ باز و بسته گره قرار دارد را بر می‌گرداند.
LastChild آخرین گره فرزند، گره مورد نظر ما را بر می‌گرداند.
Name نام گره را بر می‌گرداند.
NextSibling گره‌ای که بعد از گره جاری آمده است را بر می‌گرداند.
NodeType نوع گره جاری را نشان می‌دهد.
OuterXml گره موجود و تگ‌ها و متن‌های داخل آن را بر می‌گرداند.
OwnerDocument سند XML ی که گره به آن تعلق دارد را بر می‌گرداند.
ParentNode گره والد یا پدر گره مورد نظر را بر می‌گرداند.
PreviousSibling گره قبل از گره مورد نظر ما را برمی گرداند.
Value مقدار گره مورد نظر ما را بر می‌گرداند.

خاصیت Attributes شامل لیستی از خواص یک گره یا عنصر می‌باشد. هر خاصیت به وسیله کلاس XmlAttribute نشان داده می‌شود. به مثال زیر توجه کنید.

<Person name="John Smith" age="30"></Person>

خاصیت Attributes عنصر بالا شامل دو شیء XmlAttribute که در بردارنده اطلاعاتی برای خواص name و age می‌باشند، می‌باشد. خاصیت ChildNodes مجموعه‌ای از گره‌های فرزند، گره جاری می‌باشند. هر گره فرزند یک شیء XmlNode می‌باشد. می‌توانید با چک کردن مقدار خاصیت HasChildNodes بفهمید که آیا یک گره دارای گره فرزند می‌باشد یا نه؟ اگر گره دارای یک یا چند زیر گره (گره فرزند باشد) مقدار true و اگر هیچ زیر گره‌ای نداشته باشد مقدار false برگشت داده می‌شود. برای به دست آوردن اولین و آخرین گره فرزند یک گره می‌توان به ترتیب از خواص FirstChild و LastChild و برای به دست آوردن گره قبل و بعد از یک گره می‌توان از خواص PreviousSibling و NextSibling استفاده نمود.

<PreviousNode></PreviousNode>
<CurrentNode></CurrentNode>
<NextNode></NextNode>

ParentNode ، پدر یک گره را نشان می‌دهد. اگر گره هیچ پدری نداشته باشد این خاصیت مقدار تهی را بر می‌گرداند. خاصیت Name، نشان دهنده نام عنصر می‌باشد.

<Person>Example</Person>

نام عنصر بالا Person است. InnerText متن داخل دو تگ باز و بسته یک کنترل را بر می‌گرداند. اگر با توضیحات سر و کار داشته باشید این خاصیت متن توضیحات را بر می‌گرداند. اگر یک عنصر دارای چندین گره در داخل خود باشد، خاصیت InnerText متن داخل همه گره‌های فرزند را گرفته، آن‌ها را ترکیب و به صورت یک رشته ساده بر می‌گرداند. به کد XML زیر توجه کنید :

<Example>
   <Sample1>Text1</Sample1>
   <Sample2>Text2</Sample2>
   <Sample3>
      <Sample4>Text3</Sample4>
   </Sample3>
</Example>

خروجی خاصیت InnerText در مثال بالا، Text1Text2Text3 می‌باشد. به این نکته توجه کنید که سومین فرزند در مثال فوق (Sample3) خود دارای یک فرزند است که خاصیت InnerText متن داخل آن (Text3) را بر می‌گرداند.
InnerXml شبیه InnerText است با این تفاوت که تگ‌های XML موجود در متن را هم بر می‌گرداند.
OuterXml شبیه به InnerXml با این تفاوت که تگ‌های گره موجود و تگ‌ها و متن‌های داخل آن را بر می‌گرداند.
خاصیت OwnerDocument سند مرجع گره جاری را بر می‌گرداند. NodeType شامل مقداری از نوع شمارشی System.Xml.XmlNodeType است که به وسیله آن می‌توانید نوع یک گره را بگویید. در جدول زیر لیستی از مقادیر نوع شمارشی XmlNodeType آمده است:

مقدار توضیح
Element گره یک عنصر است.
Attribute گره یک صفت است.
Text گره یک متن است.
Comment گره یک توضیح است.
Document عنصر ریشه یک سند.
Whitespace یک فضای سفید، مانند فضای خالی، خط جدید یا tab
XmlDeclaration برای تعریف فایل XML به کار می رود.

خاصیت Value مقدار یک گره را مشخص می‌کند و در هر گره متفاوت است. به عنوان مثال فراخوانی خاصیت Value یک توضیح، متن توضیح را بر می‌گرداند و خاصیت Value یک صفت مقدار صفت. به این نکته توجه کنید که برای دسترسی به محتوای یک XmlElement باید از InnerText یا InnerXml استفاده کنید نه خاصیت Value.
قبل از معرفی متدهای کلاس XmlNode ابتدا بهتر است با Xpath آشنا شوید. XPath زبانی برای يافتن اطلاعات در يک سند XML است. با استفاده از XPath می‌توان محل و موقعيت ساختار سند و يا داده‌های موجود در يک سند XML را مشخص نمود. هدف اوليه XPath، امکان آدرس دهی بخش‌های متفاوت يک سند XML است. بمنظور تأمین خواسته فوق از امکانات و پتانسیل‌های متعددی بمنظور انجام عمليات بر روی رشته‌ها، اعداد و منطق استفاده می‌شود. XPath از يک گرامر فشرده و عدم مبتنی بر XML بهمراه URI و مقادير خصلت‌های XML استفاده می‌نماید. دليل انتخاب نام XPath برای تکنولوژی فوق بدين علت است که در حقيقت از يک آدرس بمنظور حرکت در طول يک سند XML با ساختار سلسله مراتبی استفاده می‌گردد. XPath يک سند XML را بعنوان درختی از گره‌ها شبيه سازی می‌نماید. در اين راستا، گره‌های متفاوتی نظير: گره‌های Element، گره‌های Attribute و گره‌های Text، وجود دارد برای هر گره توسط XPath، يک رشته در نظر گرفته می‌شود. برخی از انواع خاص گره‌ها دارای اسامی اختصاصی خود می‌باشند. XPath بطور کامل XML Namespace را حمايت می‌نماید در جدول زیر متدهای مفید کلاس XmlNode آمده است :

متد توضیح
AppendChild() یک کره فرزند به گره اضافه می‌کند.
InsertAfter() بعد از گره جاری یک گره ایجاد می‌کند.
InsertBefore() قبل از گره جاری یک گره ایجاد می‌کند.
PrependChild() یک گره را به ابتدای گره‌های فرزند گره مورد نظر ما اضافه می‌کند.
RemoveAll() گره‌های فرزند و خواص گره مورد نظر را حذف می‌کند.
RemoveChild() یک گره فرزند خاص مشخص را حذف می‌کند.
ReplaceChild() یک گره فرزند جدید را جایگزین یک گره فرزند قدیمی‌تر می‌کند.
SelectNodes() لیستی از گره‌هایی که با عبارت Xpath مطابقت دارند را انتخاب می‌کند.
SelectSingleNode() اولین گره‌ای که با عبارت Xpath مطابقت دارد انتخاب می‌کند.

کاربرد این متدها را در درس‌های آینده توضیح می‌دهیم.

XmlDocument

از کلاس XmlDocument برای نمایش سند XML و محتویات آن استفاده می‌شود. در زیر برخی از خواص این کلاس ذکر شده است :

خاصیت توضیح
DocumentElement عنصر ریشه سند را نشان می‌دهد.
PreserveWhitespace می‌گوید که آیا فضاهای خالی سند XML حذف یا نگهداری شوند.

در زیر برخی از متدهای کلاس XmlDocument آمده است:

متد توضیح
CreateAttribute() یک شئ XmlAttribute ایجاد می‌کند.
CreateComment() یک شئ XmlComment ایجاد می‌کند.
CreateElement() یک شئ XmlElement ایجاد می‌کند.
CreateTextNode() یک شئ XmlText با متن مشخص ایجاد می‌کند.
CreateXmlDeclaration() یک XmlDeclaration با مقدار مشخص ایجاد می‌کند.
GetElementById() یک عنصر XML با ID مشخص را بر می‌گرداند.
GetElementsByTagName() مجموعه‌ای از عناصری که با نام مشخصی مطابقت دارند را برگشت می‌دهد.
Load() یک سند XML را از یک فایل بارگذاری می‌کند.
Save() محتوای سند XML را در فایل مشخصی ذخیره می‌کند.

به متدهایی که با کلمه Create شروع شده‌اند توجه کنید. از این متدها در ساخت اشیاء XML DOM استفاده می‌شود. به عنوان مثال، اگر می‌خواهید یک عنصر (element) برای سند جاری ایجاد کنید، می‌توانید از متد CreateElement استفاده نمایید. بیشتر متدهای بالا را در درس‌های بعدی توضیح می‌دهیم.

XmlElement

از کلاس XmlElement برای نمایش یک عنصر ساده XML استفاده می‌شود. در جدول زیر خواص پر کاربرد این کلاس ذکر شده است :

خاصیت توضیح
Attributes همه صفات یک عنصر را شامل می‌شود.
HasAttributes می‌گوید که آیا عنصر شامل صفت است یا خیر؟
Value متن بین تگ‌های باز و بسته عنصر مورد نظر را بر می‌گرداند. اگر عنصر مورد نظر ما دارای عنصر فرزندی باشد مقدار این خصوصیت خالی خواهد شد.

در جدول زیر برخی از متدهای XmlElement آمده است:

متد توضیح
GetAttribute() مقدار یک صفت با نام مشخص را بر می‌گرداند.
GetAttributeNode() صفتی از یک گره با نام مشخص را بر می‌گرداند.
GetElementsByTagName() تمام عناصری که نام آنها برابران چیزی است که در پرانتز آمده از سند xml
انتخاب می‌شوند.

کلاس‌های XmlText و XmlComment به ترتیب متن داخل یک عنصر و توضیحات مربوط به آن را نمایش می‌دهند. استفاده از آنها بسیار آسان است و در درس‌های بعدی در مورد آنها توضیح نمی‌دهیم.