برنامه زير، نام اولين گره موجود در سند 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 وابسته به امکانات موجود در مرورگر نبوده و صرفا" مرورگرها ، نمايش دهنده اطلاعات ارسالی از سرويس دهنده خواهند بود .