بررسی XML Document Object Model New Page 1



ساير




 

 

 

SAKHA RAVESH CO.

 ا مروز

 پنجشنبه  3  فروردين  1396  2017  Mar.  23   Thursday ToDay
صفحه اصلی  مقالات نکته هادايره المعارف خودآموزها | تازه ها خود آزمون ها    
  نسخه قابل چاپ  

    5 4 3 2 1 

 عنوان

 نويسنده

  مشاهده

 تعداد آراء

 امتياز

 XML برای برنامه نويسا ن VB و ASP ( بخش سوم )

 مديريت وب

8749

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



جستجو

مقالات                 
دايره المعارف       
دوره های آموزشی


 

 

مشاهده گروه ها



              

 

 تهيه شده در شرکت سخا روش -  1382