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
در صورت مشاهده صفحه فوق در مرورگر
بازيابی اولين گرهpc |
برنامه زير، نام اولين گره موجود در سند XML را برمی گرداند . در برنامه فوق تمام اسکريپت ها بر روی مرورگر سرويس گيرنده اجراء و به زبان JavaScript نوشته شده اند .( نسخه فوق با نسخه نوشته شده توسط VBScript دارای اختلاف اندکی می باشند ) . اطلاعات فوق را در فايلی با نام دلخواه ذخيره و در ادامه آن را توسط مرورگر فعال و مشاهده نمائيد . مثال : بازيابی اولين گره موجود در سند mycomputer.xml ( نسخه JavaScript) <HTML> در ادامه بخش های متفاوت دو مثال فوق تشريح خواهند گرديد . استقرار يک سند XML در حافظه قبل از انجام هر گونه عمليات در رابطه با يک سند XML ، می بايست سند فوق در حافظه مستقر گردد . قبل از استقرار سند XML در حافظه ، می بايست نمونه ای از شی XML DOM را ايجاد نمود. کدهای زير که در مثال اول ( نسخه نوشته شده به زبان VBScript) ارائه شده اند ، نحوه ايجاد يک نمونه شی XML -DOM را با استفاده از متد CreateObject و استقرار يک سند XML را نشان می دهد . مثال : کدهای لازم بمنظور ايجاد يک نمونه شی XML DOM و استقرار سند XML در حافظه Set xmlDoc = CreateObject("Microsoft.xmldom") در مثال فوق ،از متد async مربوط به شی document بمنظور استقرار سند XML در حافظه بصورت همزمان استفاده شده است . بدين ترتيب مرورگر قبل از انجام هر گونه پردازش بر روی سند XML ، در انتظار استقرار تمام سند در حافظه باقی خواهد ماند . در صورتيکه از کد فوق استفاده نگردد ، مرورگر بمحض دريافت بخشی از سند ، عمليات پردازش را آغاز خواهد کرد . در برنامه فوق از متد Load بمنظور استقرار يک فايل XML در حافظه استفاده شده است . در صورتيکه قصد استقرار يک سند XML را از طريق يک رشته داشته باشيم ، می توان از متد LoadXML استفاده کرد . در نسخه جاوا اسکريپت مثال فوق ،با استفاده از شی AxtiveXObject يک نمونه از شی XML DOM ايجاد شده است . کدهای فوق بصورت زير می باشند : مثال : کدهای لازم بمنظور ايجاد يک نمونه شی XML DOM و استقرار سند XML در حافظه xmlDoc = new ActiveXObject("Microsoft.xmldom") المان سند کد زير بمنظور بازيابی يک مرجع به المان سند ( گره مادر در سند 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()"> پس از ارائه توضيحات لازم در خصوص مثال های ارائه شده ، در ادامه نحوه انجام ساير عمليات بر روی يک سند XML بکمک XML DOM تشريح می گردد . تکرار در بين گره های يک سند سند XML ارائه شده در مثال قبل (mycomputer.xml) دارای ساختار درختی زير است : با استفاده از مجموعه childNodes ، می توان عمليات تکرار در بازيابی تمام درخت XML مربوط به يک سند XML را انجام داد . برنامه زير تمام اطلاعات موجود در درخت XML را بازيابی و آنها را با يک فرمت قابل قبول ( مجموعه ای از جداول ) در خروجی نمايش خواهد داد . در اين برنامه اطلاعات مربوط به اولين سطح گره های موجود ( pc,case,docking_station) با استفاده از يک حلقه تکرار استخراج و برای بازيابی اطلاعات موجود در دومين سطح گره ها ( type, brand, model ) از يک حلقه تکرار ديگر استفاده شده است . مثال : بازيابی تمام گره های موجود در يک سند XML و نمايش آنها با يک فرمت مناسب <HTML> خروجی برنامه فوق پس از مشاهده صفحه مربوطه در مرورگر به شکل زير خواهد بود : No data نسخه جاوا اسکريپت برنامه فوق به شکل زير است : ( فقط حلقه های تکرار مشخص شده اند ) مثال : بازيابی تمام گره های موجود در يک سند XML (نسخه جاوااسکريپت ) xmlRoot = xmlDoc.documentElement بازيابی يک گره خاص و يا مجموعه ای از گره ها در برخی حالات علاقه مند به بازيابی گره ها از طريق حلقه تکرار نمی باشيم ، در چنين مواردی می توان مستقيما" اقدام به بازيابی مجموعه ای از گره ها در يک سند 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() مثال: بازيابی يک المان خاص با استفاده از متد getElementsByTagName ( نسخه javascript) function getXML() { بازيابی خصلت ها تمام اطلاعات در سند های XML از طريق محتويات المان ها ذخيره نشده و در برخی حالات از خصلت مربوط به يک المان استفاده و اطلاعات بکمک آن ذخيره می گردد . بمنظور بازيابی اطلاعات ذخيره شده در خصلت مربوط به يک المان می توان از مجموعه attributes استفاده کرد . برای ارائه توضيحات کاربردی بيشتر ، فايل mycomputer.xml ( در مثال های قبل از آن استفاده شده بود ) را با اندک تغييراتی که عمدتا" به استفاده از خصلت بهمراه المان ها بر می گردد ، تغيير نام و يک فايل ديگر با نام mycomputer1.xml را ايجاد که تگ های pc و case آن بصورت زير باشند : <pc type="Laptop" brand="Toshiba" model="Tecra 8000"> برنامه زيرخصلت های مربوط به المان PC را در خروجی نمايش می دهد . مثال : نمايش خصلت های يک المان ( نسخه VBScript) <HTML> مثال : نمايش خصلت های يک المان ( نسخه JavaScript) - فقط حلقه تکرار آورده شده است . for (intI=0;intI <= xmlPCNode.attributes.length-1;intI++) { بمنظور بازيابی محتويات يک خصلت خاص، می توان از متد getAttribute مربوط به شی node استفاده کرد . مثلا" کد زير خصلت brand مربوط به المان case را بازيابی می نمايد : Set xmlNodes = xmlDoc.getElementsByTagName("case") تاکنون به بررسی برخی از امکانات XML DOM بصورت بسيار محدود اشاره شد. XML DOM دارای مجموعه ای از خصلت ها و متد ها ی متنوع ديگر است . شرکت ماکروسافت نيز مجموعه ای ديگر از خصلت ها و متدها را در اين زمينه تعريف نموده است . بهرحال برای انجام يک عمليات بخصوص می توان از روش های متعددی استفاده و در اين زمينه يک راه حل شفاف و منحصر بفرد وجود ندارد . استفاده از XML بر روی سرويس دهنده تمام مثال های ارائه شده در بخش های قبل ، فايل های XML را بر روی سرويس گيرنده پردازش می کردند. بمنظور پردازش فايل های XML بر روی سرويس دهنده ، می توان از عنصر XMLDOM از طريق صفحات ASP استفاده کرد . برنامه زير اطلاعات موجود در فايل mycomputer.xml ( در بخش های قبل از آن استفاده شده است ) را پردازش و با يک فرمت مناسب ( استفاده از سه جدول مجزا برای نمايش هر يک از المان های سطح اول ) در خروجی نمايش می دهد . ( نظير اين عمليات در بخش های قبل نيز ارائه گرديد در اين مثال عمليات مورد نظر بر روی سرويس دهنده انجام خواهد شد ) . مثال : پردازش يک فايل XML برروی سرويس دهنده و ارائه خروجی مناسب <%@ Language=VBScript %> پس از انجام پردازش های لازم بر روی سرويس دهنده ، خروجی مناسب برای نمايش در مرورگر ارسال خواهد شد . پردازش فايل XML وابسته به امکانات موجود در مرورگر نبوده و صرفا" مرورگرها ، نمايش دهنده اطلاعات ارسالی از سرويس دهنده خواهند بود .
<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
xmlDoc.async = False
xmlDoc.load("mycomputer.xml")
xmlDoc.async = false
xmlDoc.load("mycomputer.xml")
<H1>Mycomputer XML Example</H1>
<DIV ID="divHere">
</DIV>
</BODY>
</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
case
brand:
USL
color:
black
fabric:
vinyl
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>"
}
}
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
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
}
...
<case brand="USL">
<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
xmlAtt = xmlPCNode.attributes(intI)
strDoc = strDoc + "<BR><B>" + xmlAtt.nodeName + ": </B>" +
xmlAtt.text
}
Set xmlPCNode = xmlNodes.item(0)
divHere.innerHTML = xmlPCNode.getAttribute("brand")
<%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>
