عنوان
|
نويسنده
|
مشاهده
|
تعداد
آراء |
امتياز
|
XML برای برنامه نويسا ن VB و ASP ( بخش سوم ) |
مديريت وب |
9732 |
10 |
4.1 |
با توجه به جایگاه داده در عصر حاضر و لزوم نگاه جامع به این مقوله مهم ، بر آن شدیم تا محوریت فعالیت های خود را بر روی این موضوع متمرکز نمائیم . از این رو گروه فابک با شعار فناوری اطلاعات برای کسب وکار شکل گرفت و خدمات خود را از طریق سایت www.fabak.ir به مخاطبان محترم عرضه می نماید
 |
XML برای برنامه نويسان VB و ASP ( بخش سوم )
XML برای
برنامه نويسان VB و ASP
( بخش سوم )
در
بخش اول اين مقاله با مفاهيم اوليه تکنولوژی XML
آشنا شديم . در
بخش دوم
به بررسی DTD و XML-Data Schema
پرداخته و در اين بخش به
بررسی XML Document Object Model
خواهيم پرداخت.
XML DOM ، بمنظور ارائه
قابليت های لازم برنامه نويسی برای انجام عمليات دلخواه در رابطه با اشياء
موجود در يک سند XML ، ايجاد شده است .
ساختار سلسله مراتبی اشياء در
XML DOM
ساختار اشياء در XML DOM
،
بصورت سلسله مراتبی و تصويری مناسب از اشياء موجود در سند XML
است . شکل زير يک نمونه از ساختار سلسله مراتبی اشياء در XML
DOM را نشان می دهد . شکل فوق شامل شی Document و
مجموعه ای از اشياء تودرتو ديگر است .

اشياء XML DOM
XML DOM دارای
چهار شی است :
-
شی Document .
شامل سند XML است . ( منظور گره ای با نام
Document نيست )
-
شی node . شامل
يک گره در سند XML است .
-
شی nodeList .
شامل ليستی از گره های همزاد ( برادر و يا خواهر ) است . برخی از متدهای
DOM يک شی nodeList
را بعنوان خروجی برمی گردانند.
-
شی ParseError
. از شی فوق بمنظور بازيابی آخرين مورد خطاء در رابطه با پارسينگ استفاده می شود
.
اشياء فوق دارای مجموعه ای از متدها و خصلت
ها بوده و با استفاده از يک زبان اسکريپت ، می توان عمليات مورد نظر در رابطه با يک
سند XML را بکمک آنها انجام داد .
مثال : فرض کنيد سند XML
ارائه شده در بخش های قبل را داشته باشيم ( mycomputer.xml)
مثال :
يک سندXML
نمونه (mycomputer.xml) |
<?xml version="1.0"?>
<mycomputer>
<pc>
<type>Laptop</type>
<brand>Toshiba</brand>
<model>Tecra 8000</model>
<processor>300 Mhz Pentium II</processor>
<ram>128 MB</ram>
<drives>
<drive>9 MB Hard Disk</drive>
<drive>1.4 MB Floppy Disk</drive>
<drive>CD-ROM</drive>
</drives>
<display>14 inch active matrix LCD panel</display>
<modem>Toshiba internal V.90</modem>
<network>Xircom Cardbus Ethernet II 10/100</network>
</pc>
<docking_station/>
<case>
<brand>USL</brand>
<color>black</color>
<fabric>vinyl</fabric>
</case>
</mycomputer> |
برنامه زير، نام اولين گره موجود در سند
XML را برمی گرداند . در برنامه فوق تمام اسکريپت ها بر
روی مرورگر سرويس گيرنده اجراء و به زبان VBSrcipt نوشته
شده اند . اطلاعات فوق را در فايلی با نام
دلخواه
ذخيره و در ادامه آن را توسط مرورگر فعال و مشاهده نمائيد .
مثال :
بازيابی اولين گره موجود در سند
mycomputer.xml ( نسخه VBScript) |
<HTML>
<HEAD>
<TITLE>XML Example </TITLE>
<SCRIPT LANGUAGE=vbscript>
<!--
Function getXML()
Dim xmlDoc
Dim xmlRoot
Dim xmlNode
Set xmlDoc = CreateObject("Microsoft.xmldom")
xmlDoc.async = False
xmlDoc.load("mycomputer.xml")
Set xmlRoot = xmlDoc.documentElement
Set xmlNode = xmlRoot.childNodes(0)
divHere.innerHTML = _
"<H3>" & xmlNode.nodeName & "</H3>"
End Function
-->
</SCRIPT>
</HEAD>
<BODY onload="getXML()">
<H1>بازيابی اولين گره </H1>
<DIV ID="divHere"></DIV>
</BODY>
</HTML> |
در صورت مشاهده صفحه فوق در مرورگر
، خروجی زير مشاهده خواهد شد :
بازيابی اولين گره
pc
|
برنامه زير، نام اولين گره موجود در سند
XML را برمی گرداند . در برنامه فوق تمام اسکريپت ها بر
روی مرورگر سرويس گيرنده اجراء و به زبان JavaScript
نوشته شده اند .( نسخه فوق با نسخه نوشته شده توسط VBScript
دارای اختلاف اندکی می باشند ) . اطلاعات فوق را در فايلی با نام
دلخواه ذخيره و در ادامه آن را توسط مرورگر فعال و
مشاهده نمائيد .
مثال :
بازيابی اولين گره موجود در سند
mycomputer.xml ( نسخه
JavaScript) |
<HTML>
<HEAD>
<TITLE>XML Example </TITLE>
<SCRIPT LANGUAGE=javascript>
<!--
function getXML() {
var xmlDoc
var xmlRoot
var xmlNode
xmlDoc = new ActiveXObject("Microsoft.xmldom")
xmlDoc.async = false
xmlDoc.load("mycomputer.xml")
xmlRoot = xmlDoc.documentElement
xmlNode = xmlRoot.childNodes(0)
divHere.innerHTML =
"<H3>" + xmlNode.nodeName + "</H3>"
}
//-->
</SCRIPT>
</HEAD>
<BODY onload="getXML()">
<H1>بازيابی اولين گره</H1>
<DIV ID="divHere"></DIV>
</BODY>
</HTML> |
در صورت مشاهده صفحه فوق در مرورگر
، خروجی زير مشاهده خواهد شد :
بازيابی اولين گره
pc
|
در ادامه بخش های متفاوت دو مثال فوق تشريح
خواهند گرديد .
استقرار يک سند
XML در حافظه
قبل از انجام هر گونه عمليات در رابطه با يک
سند XML ، می بايست سند فوق در حافظه مستقر گردد . قبل
از استقرار سند XML در حافظه ، می بايست نمونه ای از شی
XML DOM را ايجاد نمود. کدهای زير که در مثال اول
( نسخه نوشته شده به
زبان VBScript) ارائه شده
اند ،
نحوه ايجاد يک نمونه شی XML -DOM را با استفاده از متد
CreateObject و استقرار يک سند
XML را نشان می دهد .
مثال : کدهای
لازم بمنظور
ايجاد يک نمونه شی XML DOM و استقرار
سند XML در حافظه |
Set xmlDoc =
CreateObject("Microsoft.xmldom")
xmlDoc.async = False
xmlDoc.load("mycomputer.xml") |
در مثال
فوق ،از متد
async مربوط به شی document
بمنظور استقرار سند XML در حافظه بصورت
همزمان استفاده شده است . بدين ترتيب مرورگر قبل
از انجام هر گونه پردازش بر روی سند XML ، در انتظار
استقرار تمام سند در حافظه باقی خواهد ماند . در صورتيکه از کد فوق استفاده نگردد ،
مرورگر بمحض دريافت بخشی از سند ، عمليات پردازش را آغاز خواهد کرد . در برنامه فوق
از متد Load بمنظور استقرار يک فايل
XML در حافظه استفاده شده است . در صورتيکه قصد استقرار يک سند
XML را از طريق يک رشته داشته باشيم ، می توان از متد
LoadXML استفاده کرد .
در نسخه
جاوا اسکريپت مثال فوق ،با استفاده از شی AxtiveXObject يک نمونه از شی
XML DOM ايجاد شده است . کدهای فوق بصورت زير می
باشند :
مثال : کدهای
لازم بمنظور
ايجاد يک نمونه شی XML DOM و استقرار
سند XML در حافظه |
xmlDoc = new
ActiveXObject("Microsoft.xmldom")
xmlDoc.async = false
xmlDoc.load("mycomputer.xml") |
المان سند
کد زير
بمنظور بازيابی يک مرجع به المان سند ( گره مادر در سند XML)
استفاده شده است :( نسخه نوشته شده به زبان VBScript)
Set xmlRoot = xmlDoc.documentElement |
کد معادل جاوا اسکريپت بصورت زير است :
xmlRoot = xmlDoc.documentElement |
مجموعه ChildNodes
پس از ايجاد
يک مرجع به گره Document ،
می توان با استفاده از مجموعه childNodes مربوط به گره
Document اقدام به بازيابی گره ها نمود . کد زير ، يک
مرجع ( اشاره گر ) به اولين گره مجموعه childNodes مربوط
به المان سند ، ايجاد می نمايد
Set xmlNode = xmlRoot.childNodes(0) |
کد معادل جاوا اسکريپت بصورت
زير است :
xmlNode = xmlRoot.childNodes(0) |
تمام مجموعه ها در XML
با صفر شروع می گردد . بنابراين اولين المان همواره صفر، دومين المان يک و ...
خواهد بود.
نمايش
XML بر روی صفحه
بمنظور نمايش داده های
XML در يک صفحه Html ، می بايست از روش های خاصی
استفاده نمود. يکی از مناسبترين اين روش ها ، استفاده از خصلت
innerHTML يک تگ Html است . کد زير نحوه
انجام عمليات فوق را نشان می دهد ( نسخه VBScript) . در
کد فوق از خصلت nodeName مربوط به گره
، برای بدست
آوردن نام المان XML استفاده شده است .
divHere.innerHTML = "<H3>" & xmlNode.nodeName &
"</H3>" |
کد زير نحوه
نمايش داده های XML در يک صفحه Html
را با استفاده از خصلت innerHTML نشان می
دهد ( نسخه حاوا اسکريپت )
divHere.innerHTML ="<H3>" + xmlNode.nodeName + "</H3>" |
صدا زدن کدهای اسکريپت
DOM
در مثال های ارائه شده ( نسخه نوشته
شده با VBScript و نسخه نوشته شده با جاوا اسکريپت ) ،از
تابعی با نام getXML
همزمان با فعال شدن صفحه استفاده شده است .
تابع فوق مسئول استقرار سند XML در حافظه و يافتن اولين
المان در بوده و ماحصل عمليات را در خروجی نمايش خواهد داد .
<BODY onload="getXML()"> <H1>Mycomputer XML
Example</H1> <DIV ID="divHere"> </DIV> </BODY> </HTML> |
پس از ارائه توضيحات لازم در خصوص مثال های
ارائه شده ، در ادامه نحوه انجام ساير عمليات بر روی يک سند XML
بکمک XML DOM تشريح می گردد .
تکرار در بين گره های
يک سند
سند XML ارائه
شده در مثال قبل (mycomputer.xml) دارای ساختار
درختی زير است :

با استفاده از مجموعه
childNodes ، می توان عمليات تکرار در بازيابی تمام درخت
XML مربوط به يک سند XML را
انجام داد . برنامه زير تمام اطلاعات موجود در درخت XML
را بازيابی و آنها را با يک فرمت قابل قبول ( مجموعه ای از جداول ) در خروجی نمايش
خواهد داد . در اين برنامه اطلاعات مربوط به اولين سطح گره های موجود (
pc,case,docking_station) با استفاده از يک حلقه تکرار
استخراج و برای بازيابی اطلاعات موجود در دومين سطح گره ها (
type, brand, model ) از يک حلقه تکرار ديگر استفاده شده است .
مثال : بازيابی
تمام گره های موجود در يک سند
XML و نمايش آنها با يک فرمت مناسب |
<HTML>
<HEAD>
<TITLE>XML Example </TITLE>
<STYLE>
H3 {color: blue}
</STYLE>
<SCRIPT LANGUAGE=vbscript>
<!--
Option Explicit
Function getXML()
Dim xmlDoc
Dim xmlRoot
Dim xmlPNode
Dim xmlNode
Dim strDoc
Set xmlDoc = CreateObject("Microsoft.xmldom")
xmlDoc.async = False
xmlDoc.load("mycomputer.xml")
Set xmlRoot = xmlDoc.documentElement
For Each xmlPNode In xmlRoot.childNodes
strDoc = strDoc & "<H3>" & xmlPNode.nodeName & "</H3>"
If xmlPNode.childNodes.length = 0 Then
strDoc = strDoc & "<I>No data</I>"
Else
strDoc = strDoc & "<TABLE border>"
For Each xmlNode In xmlPNode.childNodes
strDoc = strDoc & "<TR>" & _
"<TD><B>" & xmlNode.nodeName & ":</B></TD>" & _
"<TD>" & xmlNode.text + "</TD>" & "</TR>"
Next
End If
strDoc = strDoc & "</TABLE>"
Next
divHere.innerHTML = strDoc
End Function
-->
</SCRIPT>
</HEAD>
<BODY onload="getXML()">
<H1 align="center" dir="rtl">بازيابی تمام المان های يک سند
XML</H1>
<DIV ID="divHere"></DIV>
</BODY>
</HTML> |
خروجی برنامه فوق پس
از مشاهده صفحه مربوطه در مرورگر به شکل زير خواهد بود :
بازيابی تمام المان های يک سند XML
pc
type: |
Laptop |
brand: |
Toshiba |
model: |
Tecra 8000 |
processor: |
300 Mhz Pentium II |
ram: |
128 MB |
drives: |
9 MB Hard Disk 1.4 MB Floppy Disk CD-ROM |
display: |
14 inch active matrix LCD panel |
modem: |
Toshiba internal V.90 |
network: |
Xircom Cardbus Ethernet II 10/100 |
docking_station
No data
case
brand: |
USL |
color: |
black |
fabric: |
vinyl |
|
نسخه جاوا اسکريپت برنامه فوق به شکل زير است : (
فقط حلقه های تکرار مشخص شده اند )
مثال : بازيابی
تمام گره های موجود در يک سند
XML (نسخه جاوااسکريپت ) |
xmlRoot =
xmlDoc.documentElement
strDoc = "<TABLE>"
for (intI=0; intI <= xmlRoot.childNodes.length-1;intI++) {
xmlPNode = xmlRoot.childNodes(intI)
strDoc = strDoc +"<H3>" + xmlPNode.nodeName +
"</H3>"
if (xmlPNode.childNodes.length == 0)
strDoc = strDoc + "<I>No
data</I>"
else {
strDoc = strDoc + "<TABLE border>"
for (intJ=0;intJ <= xmlPNode.childNodes.length-1;intJ++) {
xmlNode = xmlPNode.childNodes(intJ)
strDoc = strDoc + "<TR>" +
"<TD><B>" + xmlNode.nodeName + ":</B></TD>" +
"<TD>" + xmlNode.text + "</TD>" +
"</TR>"
}
strDoc = strDoc + "</TABLE>"
}
} |
بازيابی يک گره خاص و يا مجموعه ای از گره ها
در برخی
حالات علاقه مند به بازيابی گره ها از طريق حلقه تکرار نمی باشيم
، در چنين مواردی می توان مستقيما" اقدام به
بازيابی مجموعه ای از گره ها در يک سند XML نمود . در
اين رابطه می توان از متد getElementsByTagName
استفاده کرد . گرامر استفاده از متد فوق بشکل زير است :
nodelist =
document.getElementsByTagName(tagname) |
در گرامر فوق :
-
nodelist ، يک
شی از نوع nodelist است .
-
document ، يک شی
از نوع document است .
-
tagname ، رشته ای
بمنظور مسخص نمودن يک المان است . مثلا" "case/brand" .
برای بازيابی تمام درخت XML می توان از
"*" استفاده کرد .
متد
getElementsByTagName ، يک شی nodeList را بر می
گرداند . شی nodeList ذاتا" معادل مجموعه
childNodes است . شی فوق دارای يک خصلت (
lenght) و سه متد (
item,nextNode,reset) است . از متد item
مربوط به شی nodeList بمنظور بازيابی يک آيتم از مجموعه
گره های موجود در nodeList استفاده می گردد . در مثال
زير از متد getElementsByTagName بمنظور
بازيابی متن مربوط به المان pc/ram
استفاده شده است .
مثال : بازيابی
يک المان خاص با استفاده از متد
getElementsByTagName ( نسخه Vbscript) |
Function getXML()
Dim xmlDoc
Dim xmlNodes
Set xmlDoc = CreateObject("Microsoft.xmldom")
xmlDoc.async = False
xmlDoc.load("mycomputer.xml")
Set xmlNodes = xmlDoc.getElementsByTagName("pc/ram")
divHere.innerHTML = xmlNodes.item(0).text
End Function |
مثال: بازيابی
يک المان خاص با استفاده از متد
getElementsByTagName ( نسخه
javascript) |
function getXML() {
var xmlDoc
var xmlNodes
xmlDoc = new
ActiveXObject("Microsoft.xmldom")
xmlDoc.async = false
xmlDoc.load("mycomputer.xml")
xmlNodes =
xmlDoc.getElementsByTagName("pc/ram")
divHere.innerHTML =
xmlNodes.item(0).text
} |
بازيابی خصلت ها
تمام اطلاعات
در سند های XML از طريق محتويات المان ها ذخيره
نشده و در برخی حالات از خصلت مربوط به يک المان استفاده و اطلاعات بکمک آن ذخيره
می گردد . بمنظور بازيابی اطلاعات ذخيره شده در خصلت مربوط به يک المان می توان از
مجموعه attributes استفاده کرد . برای ارائه
توضيحات کاربردی بيشتر ، فايل
mycomputer.xml ( در مثال های قبل از آن استفاده شده بود ) را با اندک
تغييراتی که عمدتا" به استفاده از خصلت بهمراه المان ها بر می گردد ، تغيير نام و
يک فايل ديگر با نام mycomputer1.xml را ايجاد که تگ های
pc و case آن بصورت زير باشند
:
<pc type="Laptop" brand="Toshiba" model="Tecra 8000">
... <case brand="USL"> |
برنامه
زيرخصلت های مربوط به المان PC را در خروجی نمايش می دهد
.
مثال : نمايش
خصلت های يک المان ( نسخه
VBScript) |
<HTML>
<HEAD>
<TITLE>XML Example </TITLE>
<SCRIPT LANGUAGE=vbscript>
<!--
Function getXML( )
Dim xmlDoc
Dim xmlAtt
Dim xmlPNode
Dim strDoc
Dim xmlNodes
Dim xmlPCNode
Set xmlDoc = CreateObject("Microsoft.xmldom")
xmlDoc.async = False
xmlDoc.load("mycomputer.xml")
Set xmlNodes = xmlDoc.getElementsByTagName("pc")
Set xmlPCNode = xmlNodes.item(0)
For Each xmlAtt in xmlPCNode.attributes
strDoc = strDoc & "<BR><B>" &
xmlAtt.nodeName & ":</B>" & _
xmlAtt.text
Next
divHere.innerHTML = strDoc
End Function
-->
</SCRIPT>
</HEAD>
<BODY onload="getXML( )">
<H1 align="center" dir="rtl">بازيابی خصلت های يک المان </H1>
<DIV ID="divHere"></DIV>
</BODY>
</HTML> |
خروجی برنامه فوق پس از مشاهده صفحه مربوطه در
مرورگر به صورت زير است :
بازيابی خصلت های يک المان
type:Laptop
brand:Toshiba
model:Tecra 8000
|
مثال : نمايش
خصلت های يک المان ( نسخه
JavaScript) -
فقط حلقه تکرار آورده شده است . |
for
(intI=0;intI <= xmlPCNode.attributes.length-1;intI++) {
xmlAtt =
xmlPCNode.attributes(intI)
strDoc = strDoc +
"<BR><B>" + xmlAtt.nodeName + ": </B>" +
xmlAtt.text
} |
بمنظور
بازيابی محتويات يک خصلت خاص، می توان از متد getAttribute
مربوط به شی node استفاده کرد . مثلا" کد زير خصلت
brand مربوط به المان case را
بازيابی می نمايد :
Set xmlNodes =
xmlDoc.getElementsByTagName("case") Set xmlPCNode = xmlNodes.item(0)
divHere.innerHTML = xmlPCNode.getAttribute("brand") |
تاکنون به
بررسی برخی از امکانات XML DOM بصورت بسيار محدود اشاره
شد. XML DOM دارای مجموعه ای از خصلت ها و متد ها ی
متنوع ديگر
است . شرکت ماکروسافت نيز مجموعه ای ديگر از خصلت ها و متدها را در اين زمينه تعريف
نموده است . بهرحال برای انجام يک عمليات بخصوص می توان از روش های متعددی استفاده
و در اين زمينه يک راه حل شفاف و منحصر بفرد وجود ندارد .
استفاده از XML بر روی
سرويس دهنده
تمام مثال
های ارائه شده در بخش های قبل
، فايل های XML را بر
روی سرويس گيرنده پردازش می کردند. بمنظور پردازش فايل های XML
بر روی سرويس دهنده
، می توان از عنصر XMLDOM از طريق
صفحات ASP استفاده کرد . برنامه زير اطلاعات موجود در
فايل mycomputer.xml ( در بخش های قبل از آن استفاده شده
است ) را پردازش و با يک فرمت مناسب ( استفاده از سه جدول مجزا برای نمايش هر يک از
المان های سطح اول ) در خروجی نمايش می دهد . ( نظير اين عمليات در بخش های قبل نيز
ارائه گرديد در اين مثال عمليات مورد نظر بر روی سرويس دهنده انجام خواهد شد ) .
مثال :
پردازش يک فايل XML برروی سرويس دهنده
و ارائه خروجی مناسب |
<%@ Language=VBScript
%>
<%Option Explicit%>
<HTML>
<HEAD>
<TITLE>XML/ASP Example </TITLE>
<STYLE>
H3 {color: blue}
</STYLE>
</HEAD>
<H1>Mycomputer XML Tree Parsed on the Server</H1>
<%
Dim xmlDoc
Dim xmlRoot
Dim xmlPNode
Dim xmlNode
Dim strDoc
Set
xmlDoc = Server.CreateObject("Microsoft.xmldom")
xmlDoc.async = False
xmlDoc.load(Server.MapPath("mycomputer.xml"))
Set xmlRoot = xmlDoc.documentElement
For Each xmlPNode In xmlRoot.childNodes
strDoc = strDoc & "<H3>" & xmlPNode.nodeName & "</H3>"
If xmlPNode.childNodes.length = 0 Then
strDoc = strDoc & "<I>No data</I>"
Else
strDoc = strDoc & "<TABLE border>"
For Each xmlNode In xmlPNode.childNodes
strDoc = strDoc & "<TR>" & _
"<TD><B>" & xmlNode.nodeName & ":</B></TD>" & _
"<TD>" & xmlNode.text + "</TD>" & _
"</TR>"
Next
End If
strDoc = strDoc & "</TABLE>"
Next
Response.Write strDoc
%>
</BODY>
</HTML> |
پس از
انجام پردازش های لازم بر روی سرويس دهنده
، خروجی مناسب
برای نمايش در مرورگر ارسال خواهد شد . پردازش فايل
XML وابسته به امکانات موجود در مرورگر نبوده و صرفا"
مرورگرها
، نمايش دهنده اطلاعات ارسالی از سرويس دهنده
خواهند بود .