استفاده از XML یکی از راه های به اشتراک گذاشتن ، ذخیره و انتقال اطلاعات است . مثلا ً در وب سرویس ها برای انتقال اطلاعات از XML استفاده می شود . بسیاری از نرم افزارها بخش یا تمامی اطلاعاتشان را به شکل XML ذخیره و بازیابی می کنند . یکی از مسائلی که همیشه کار با XML را در حجم زیاد دچار مشکل می گرده بهینه نبودن جستجو و ذخیره تغییرات در آن بوده است . فایل XML یک نوع فایل متنی است ، مانند یک text فایل ساده . این برای نرم افزارهایی که تک کاربر و در یک ماشین اجرا می شود مشکل خاصی ایجاد نمی کند اما در محیط شبکه و client server مفید نیست .


SQL Server به عنوان یک نرم افزار برای ذخیره اطلاعات در سطح سازمان ها ، در نسخه 2005خود امکان پشتیبانی از نوع داده XML دارد و برای کا ربا XML از DMLهای استاندارد جهانی و آنهایی که مایکروسافت برایش ساخته است استفاده می کند . استفاده از SQL Server 2005 و DML های مربوط به کار با XML باعث افزایش سرعت و کارایی نرم افزارهایی می شود که می خواهند در حجم های زیاد از XML استفاده کنند .


امکاناتی که SQL Server 2005 به ما برای کار با XML می دهد عبارتند از :
1. Data Type جدید با نام  XML برای ذخیره XML
2. امکان ثبت Schema برای XML ، بررسی اعتبار اطلاعاتی که اضافه می کنیم با schema
3. تجزیه خودکار گره های XML برای index کردن و ذخیره آنها در یک جدول که البته در دسترس ما نیست
4. استفاده از XQuery و XML-DML برای کار با اطلاعات


البته شرکتهای دیگر مثل IBM اشکالهایی به مدل مایکروسافت گرفته اند . برای نمونه این دو لینک را مشاهده کنید ، یک و دو

 

ثبت Schema


Schema امکان تعریف مفهوم اطلاعات را به ما می دهد . مثلا ً در schema تعریف می کنیم که اگر مقدار یک گره 5 بود منظور از 5 مقدار عددی است یا رشته (در XML همه چیز به شکل متنی ذخیره می شود ) . با استفاده از schema ، client  می تواند تشخیص دهد که برای یک گره خاص چه کاری باید انجام دهد . برای اطلاعات بیشتر در مورد schema به http://www.w3.org/TR/xml-infoset/ مراجعه کنید . در SQL Server 2005 انباره ای مشخص برای schema ها قرار دارد . برای اضافه کردن Schema از دستور Create XML Schema به روش زیر استفاده می کنیم .

create xml schema collection HamedSchema3 as

'<xs:schema targetNamespace="HamedSchema3" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="MySpecs">

<xs:complexType>

<xs:sequence>

<xs:element name="Spec1" type="xs:string" />

<xs:element name="Spec2" type="xs:string" />

<xs:element name="Spec3" type="xs:string" />

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:schema>'

Schema ایجاد شده را می توان در Management Studio مشاهده کرد :

 

 

برای حذف schema از دستور drop xml schema و برای ویرایش آن از alter استفاده می شود . البته برای alter محدودیت هایی وجود دارد که در اینجا می توانید مشاهده کنید .

 

نوع داده XML


از نوع داده جدید ، XML ، مانند بقیه انواع داده ها می توان استفاده کرد . در تعریف نوع ستون ، در Stored Procedure ها  و هر جای دیگری که از int و nvarchar استفاده می شود . در این نوع داده ، هر XML ی که well formed باشد می تواند ذخیره شود چه یک document کامل باشد ، چه بخشی از آن . ولی well formed بودن اجباری است .


مقادیر XML ی که در ستونی از نوع XML قرار می گیرند می توانند Typed باشند یا un-Typed . Typed زمانی است که برای مقدار یا کل ستون (هنگام تعریف) از یک schema ی که قبلا ً تعریف شده است نیز نام برده شود . مثلاً هنگام تعریف ستون ذکر شود که مقدار داخل این ستون حتماً می بایست توسط HamedSchema3  بررسی شوند . مانند :

Create table HamedTable ( id int ,title nvarchar(30), xmlcolumn xml ( hamedschema3))

 

 

حالا اطلاعات ذخیره شده در جدول به اجزایی که در schema تعریف شده است تجزیه می شوند . با این روش که خود SQL Server آن را انجام می دهد سرعت ذخیره و بازیابی اطلاعات بیشتر می شود .

 


افزودن سطر جدید به جدول


برای درج سطر جدید به جدول از دستور Insert استفاده می شود با این نکته که در مقدار ستونی که XML است می بایست یک مقدار well formed قرارداد . اگر ستون از schema ی مشخصی استفاده بکند می بایست مقدار آن ستون نیز از آن schema پیروی کند .

 

insert into testxml2 (title,xmlcolumn)

values ('monitor' ,

'<x:MySpecs xmlns:x="HamedSchema3">

<Spec1>lcd 1</Spec1>

<Spec2>wide</Spec2>

<Spec3>Sony</Spec3>

</x:MySpecs>

'

)

select * from testxml2

 

 

 

پرس و جو از بانک


برای دریافت اطلاعات از بانک روش های مختلفی وجود دارد . روش ساده تر این است که مثل یک نوع داده دیگر مانند int مقدار ستون XML را بخوانیم . این روش مانند این است که اصلاً نوع داده ی XML نداشته باشیم و بخواهیم بوسیله Parser ها اطلاعات موجود در ستون را بازیابی کنیم . روش دیگر استفاده XQuery و XML-DML است .

 

XQuery و XML-DML


XML Query یا XQuery به منظور پرس و جو در XML ابداع شده است . XQuery ترکیب XPath و مفاهیمی است که کسانی که با SQL کار کرده اند با آن آشنا باشند . اطلاعات تکمیلی درباره XQuery در اینجا است . http://www.w3.org/XML/Query/ برای مثال


doc(“filename.xml”)/root/item[@id=”2”]/name


تابع doc ، document موجود در filename را باز کرده و نام آیتمی را که شماره آن 2 است را بر می گرداند . SQL Server 2005 تعدادی از دستورات XQuery که پر استفاده هستند را پشتیبانی می کند .


در XML Data Manipulation Language یا XML-DML توابعی مانند query ، exist و modify وجود دارد که بوسیله آنها می توان بدون اینکه کل یک document را خواند به یک گره از آن دسترسی پیدا کرد یا آن را ویرایش نمود .

 


استفاده از query

مثالی که برای XQuery آورده شده بود در خط زیر بوسیله به شکلی دیگر آورده شده است :


Select myXMLField.query(‘/root/item[@id=”2”]/name’) from mytable


خروجی دستور فوق عبارتی مانند زیر است


<name>hamed</name>


اگر از تابع data استفاده شود فقط مقدار گره برگردانده می شود :


Select myXMLField.query( ‘data(/root/item[@id=”2”]/name)’) from mytable


اگر این پرس و جوها برای یک ستون داری schema باشد ، می توان schemaی آن را مشخص شود .

select xmlcolumn.query('declare namespace s = "HamedSchema3" ;

/s:MySpecs/Spec1') from HamedTable

 

البته استفاده از مدل typed سریعتر از حالت untyped است .

 


استفاده از exist


اگر پارامتری که در exist مشخص می شود وجود داشته باشد مقدار true و اگر نباشد false بر می گرداند .

select title from testxml2

where xmlcolumn.exist('declare namespace s="HamedSchema3" ;

/s:MySpecs[Spec1="lcd 1"]') = 1

 

استفاده از modify


از modify برای تغییر در مقدار ستون xml استفاده می شود . این تابع 3 نوع عملیات انجام می دهد . افزودن گره جدید ، حذف یک گره و جایگزین کردن مقدار یک گره .


حذف تمامی nodename ها از جدول  :

update tablename

set fieldname.modify('delete //nodename)

افزودن یک گره جدید :

update tablename

set fieldname.modify('insert <mynode>salam</mynode> as first into (/root)[1] ')

تغییر مقدار یک گره :

update HamedTable2

set xmlcolumn.modify('replace value of (//Spec1)[1] with "LCD"')

where xmlcolumn.exist('declare namespace s="HamedSchema3" ; /s:MySpecs[Spec1="lcd 1"]') = 1

در این متن سعی شد به شکل بسیار مختصر با نوع داده XML و کارهایی که روی آن در SQL Server 2005 می توان انجام داد آشنا شویم . در آینده در مورد هر یک موارد فوق مطالب مفصلی خواهم نوشت .
منابع
15seconds ،  MSDN و developer

Gravatarمحمود مروج
جمعه ساعت 17:26 , 13/10/1387
بسیار متشکر حامد جان. این قبیل مقالات موجز بسیار برای شخصی مثل من کاربرد دارد تا سریع نکات جدید را دریافت کنم و در ذهن بسپارم.
نام :   
ايميل :      اين سايت از سيستم گراواتر استفاده می کند ، اگر در گراواتر دارای کد کاربری هستيد می توانيد از آن آدرس ايميل استفاده کنيد.  
وب سايت :   
ديدگاه :   
عدد زير را وارد کنيد :
  


  پيام شما بعد از بازبينی افزوده خواهد شد.