وبلاگ تخصصي برنامه نويسي با VB

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


مقدمه :
همانطور که در قسمت سوم مباحث برنامه نويسی اکتيوايکس های سرور سايد گفته شد برای قرار دادن پارامترهای اتصال به بانک اطلاعاتی از فايل XML استفاده خواهيم نمود . بنابراين ابتدا بايستی کلاسی برای کار با فايلهای XML بنويسيم . توجه داشته باشيد که کلاسی که در اين بخش معرفی می شود کلاسی ساده می باشد که فقط با آن می توان مقدار يک ند Node وجود در فايل xml را خواند . در صورت نياز ، می توانيد خودتان متدهای ديگری را به آن اضافه کنيد . برای اين منظور نکاتی را در انتهای همين بخش آورده ام .
XML يک زبان نشانه ای توسعه پذير ( eXtensible Markup Language ) است که در سال 1998 توسط کنسرسيوم وب جهانی 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>


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

1 - توجه داشته باشيد که 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 را ذخيره کنيد .
+ حامد شیدائیان ; ٤:٢۳ ‎ب.ظ ; شنبه ۳۱ خرداد ،۱۳۸٢
comment نظرات ()