( تعداد نمایش : 1775 )

ایجاد کلاسی برای کار با فایلهای XML

مقدمه :
همانطور که در قسمت سوم مباحث برنامه نویسی اکتیوایکس های سرور ساید گفته شد برای قرار دادن پارامترهای اتصال به بانک اطلاعاتی از فایل XML استفاده خواهیم نمود . بنابراین ابتدا بایستی کلاسی برای کار با فایلهای XML بنویسیم . توجه داشته باشید که کلاسی که در این بخش معرفی می شود کلاسی ساده می باشد که فقط با آن می توان مقدار یک ند Node وجود در فایل xml را خواند . در صورت نیاز ، می توانید خودتان متدهای دیگری را به آن اضافه کنید . برای این منظور نکاتی را در انتهای همین بخش آورده ام .
XML یک زبان نشانه ای توسعه پذیر ( eXtensible Markup Language ) است که در سال ۱۹۹۸ توسط کنسرسیوم وب جهانی W3C ایجاد شد . XML واقعاً یک زبان نیست بلکه یک متا-زبان است و برای توصیف سایر زبانها بکار می رود . داده ها در فایلهای XML براحتی قابل تعریف و استفاده هستند .
مثالی از یک فایل XML :

<user>
<name>ali</name>
<id>12</id>
</user>

کار با فایلهای XML در وی بی :
برای کار با فایلهای xml در ویژوال بیسیک بایستی ابتدا از بخش References مورد Microsoft XML 3.0 را انتخاب کنید . سپس یک Class Modules به پروژه تان اضافه کنید و نام آنرا XMLReader بگذارید . در این کلاس ابتدا یک متغیر از نوع شی xml برای کار با فایلهای xml تعریف می کنیم :

Private xml

سپس متدی برای مقداردهی اولیه شی xml می نویسیم . این متد دارای یک متغیر ورودی است که نام فایل xml مورد نظر می باشد :

Public Sub Initiate(ByVal filename As String)x
Set xml = CreateObject(“Microsoft.XMLDOM”)x
xml.async = False
xml.Load (server.MapPath(filename))x
End Sub

توجه کنید که در کد فوق از شی server برای یافتن مسیر فیزیکی فایل XML استفاده شده است بنابراین ابتدا بایستی در Class_Initialize این شی را مطابق مطالب درس دوم مقداردهی کنید .

حال بایستی متدی برای خواندن مقدار یک ند از فایل xml بنویسیم . در این متد توسط یک حلقه for each ندهای فایل را بررسی می کنیم تا ندی را بیابیم که نامش مشابه با متغیر ورودی متد است . سپس با استفاده از خاصیت nodeValue می توانیم مقدار آنرا بخوانیم .

Public Function getvalue(ByVal NName As String) As String
Dim x
getvalue = “”x
For Each x In xml.documentElement.childNodes
If x.nodeName = NName Then
getvalue = x.childNodes(0).nodeValue
Exit For
End If
Next
End Function

مثالی از کار با کلاس XMLReader :
همانطور که گفته شد می توانیم پارامترهای اتصال به بانک اطلاعاتی را در فایل XML قرار دهیم و در زمان Initiate کردن ADODB برای اتصال به بانک اطلاعاتی ، آنها را بخوانیم :

Dim xmlf As New XMLReader
Call xmlf.Initiate(“config.xml”)x
userName = xmlf.getvalue(“DataBaseID”)x
Password = xmlf.getvalue(“DataBasePassword”)x
database_name = xmlf.getvalue(“DataBaseName”)x
server_name = xmlf.getvalue(“ServerAddress”)x

ساختار یک فایل نمونه config.xml بصورت زیر می باشد :

<Application>testIt</Application>
<ServerAddress>192.168.0.1</ServerAddress>
<DataBaseName>Edatabase</DataBaseName>
<DataBaseID>Euser</DataBaseID>
<DataBasePassword>Epass</DataBasePassword>

سایر نکات برای توسعه کلاس فوق :
نکات زیر شما را در نوشتن کلاسی کاملتر راهنمایی می کنند :

۱ – توجه داشته باشید که xml.documentElement بعنوان ریشه فایل xml محسوب می شود . بنابراین برای دسترسی به ریشه می توان یک شی ریشه نیز تعریف کرد :

Dim root
Set root = xml.documentElement

2 – در صورتیکه یک فایل xml دارای چندین ند در ریشه اش باشد و هر ند ریشه نیز دارای چندین ند درونی باشد توسط خاصیت root.childNodes.length و با استفاده از یک حلقه for می توان به این ندها دسترسی داشت . برای مثال فایل زیر را درنظر بگیرید :

<people>
<user>
<name>ali</name>
<id>1</id>
</user>
<user>
<name>reza</name>
<id>2</id>
</user>
</people>

حلقه زیر روش دسترسی را به این فایل نشنان می دهد :

For I = 0 TO (root.childNodes.length – 1)x
Set thisChild = root.childNodes(I)x
name = thisChild.childNodes(0).Text
id = thisChild.childNodes(1).Text
Next

3 – اضافه کردن ند به فایل : برای اضافه کردن ند از متدهای createNode و appendChild استفاده می شود برای مثال برای اضافه کردن یک user جدید به مثال فوق :

Set newuser = xml.createNode(“element”, “people”, “”)x
Dim name,id
Set newname = xml.createNode(“element”, “name”, “”)x
newname.text = yourname
Set newid = xml.createNode(“element”, “id”, “”)x
newid.text = yourid
newuser.appendChild(newname)x
newuser.appendChild(newid)x
root.appendChild(newuser)x

در انتها نیز بایستی فایل را ذخیره نمود :

xml.save(Server.Mappath(filename))x

4 – حذف یک ند از فایل : برای حذف یک ند از فایل توسط یک حلقه for بایستی ند مورد نظر را یافته و سپس توسط متد removeChild آنرا حذف کنیم :

found = False
For I = (root.childNodes.length – 1) TO 0 STEP -1
Set thisChild = root.childNodes(I)x
name = thisChild.childNodes(0).Text
If name = searchname Then
root.removeChild(thisChild)x
found = True
End If
Next

در انتها نیز فایل xml را ذخیره کنید .

دیدگاه خود را بیان کنید.

باید وارد سایت شده باشید برای دیدگاه دادن