دهلران پی سی
سایت جامع علمی ,آموزشی,فرهنگی و تفریحی

 

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

 

 

 

 

 





تاریخ: سه‌شنبه 13 فروردین 1392
ارسال توسط dlp

ورود کاربران

خوش آمدید! لطفا وارد حساب خود شوید

رمز عبور را فراموش کرده‌اید؟
حساب کاربری ندارید؟

فراموشی رمز عبور

نام کاربری یا ایمیل خود را وارد کنید

یا

ثبت نام کاربران

در چند ثانیه حساب کاربری خود را بسازید

قبلا ثبت نام کرده‌اید؟

نظرات کاربران

دیدگاه خود را با ما در میان بگذارید