במאמר זה אני אסביר כיצד לקרוא קובץ XML, ע”י פקד ActiveX בשם Microsoft.XMLDOM,
גם בעזרת JavaScript וגם בעזרת VBScript.
קובץ ה-XML
במאמר זה נשתמש בקובץ library.xml, שמכיל פרטים על ספרים בספריה. (בקובץ זה ישנם שלושה ספרים)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?xml version=“1.0”?><library> <book>
<title>Its not your party</title>
<author>Avner Shavit</author>
<pages>143</pages>
<year>2000</year>
</book> <book>
<title>Addiction</title>
<author>Ram Oren</author>
<pages>128</pages>
<year>2002</year>
</book> <book>
<title>The Clock</title>
<author>Ka. Tzetnik</author>
<pages>97</pages>
<year>1989</year>
</book> </library>
|
|
כיצד שולפים נתונים מקובץ ה-XML?
ניצור דף HTML חדש, ונוסיף את תגית ה-Script ב-body.
1
2
3
4
5
6
7
8
9
10
|
<html>
<head>
<title>Library</title>
</head>
<body>
<script> </script>
</body>
</html>
|
|
ניצור אובייקט XMLDOM חדש:
1
2
|
//JavaScript
var xmlDoc = new ActiveXObject(“microsoft.XMLDOM”)
|
|
1
2
3
|
‘VBScript
Dim xmlDoc
Set xmlDoc = CreateObject(“microsoft.XMLDOM”)
|
|
המאפיין async
המאפיין async קובע האם ניתן להתחיל לעבד את הסקריפט שקורא את הנתונים, לפני שקובץ ה-XML נטען, או האם יש לחכות עד שקובץ ה- XML יטען, ורק לאחר מכן לעבד את הנתונים.
ערכים אפשריים:
- True – ניתן להמשיך בביצוע הסקריפט ועיבוד הנתונים לפני שקובץ ה- XML נטען במלואו.
- False – ביצוע הסקריפט ועיבוד הנתונים ימשך רק לאחר שקובץ ה- XML נטען במלואו ללא שגיאות.
במאמר לא נשתמש בטעינה אסינכרונית (false). שימוש בטעינה אסינכרונית (true), דורש בדיקה שכל קובץ ה-xml נטען, כדי שלא יווצר מצב שהסקריפט מנסה לעבד את הנתונים לפני שקובץ ה-XML נטען.
1
2
|
//JavaScript
xmlDoc.async = false;
|
|
1
2
|
‘VBScript
xmlDoc.async = False
|
|
טעינת קובץ XML
לאחר מכן נטען את קובץ ה-XML ע”י הפקודה load:
1
|
xmlDoc.load(“library.xml”)
|
|
ניתן לטעון קובץ XML גם מהאינטרנט, ע”י ציון כתובת ה- url שלו:
1
|
xmlDoc.load(“http://www.books.com/library.xml”)
|
|
קריאת הנתונים
קובץ ה-XML בנוי מענפים רבים, הענף המרכזי (ה-Root Element), בקובץ library.xml, הוא library. פנייה אליו תתבצע ע”י:
xmlDoc – אובייקט המסמך.
documentElement – התג (הענף) הראשי של הקובץ.
ל- documentElement יש ענפי משנה (book), פנייה אליהם תתבצע ע”י השיטה item של האובייקט childNodes:
1
|
xmlDoc.documentElement.childNodes.item(x)
|
|
x – מציין את מספר הענף (כך שמספורם מתחיל מאפס). כלומר, בכדי לפנות לענף המשנה הראשון, נשתמש ב:
1
|
xmlDoc.documentElement.childNodes.item(0)
|
|
לענף book יש ענפי משנה משלו, פנייה אליהם תתבצע גם ע”י childNodes:
1
|
xmlDoc.documentElement.childNodes.item(0).childNodes.item(0)
|
|
השורה הנ”ל פונה לכותרת של הספר הראשון, בכדי להציב את ערכה במשתנה נעשה כך:
1
2
|
var title;
title = xmlDoc.documentElement.childNodes.item(0).childNodes.item(0).text
|
|
שימו לב ל- text בסוף השורה, שמורה להכניס למשתנה את הערך של הענף, ולא להצביע עליו.
הצגת הנתונים באמצעות document.write
נציג את הנתונים של הספר הראשון כך:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<script>
var xmlDoc = new ActiveXObject(“microsoft.XMLDOM”);
xmlDoc.async = false;
xmlDoc.load(“library.xml”) //טעינת הקובץ//הגדרת משתנים אליהם נכניס את פרטי הספר
var title;
var author;
var pages;
var year; //הכנסת פרטי הספר אל המשתנים
title = xmlDoc.documentElement.childNodes.item(0).childNodes.item(0).text;
author = xmlDoc.documentElement.childNodes.item(0).childNodes.item(1).text;
pages = xmlDoc.documentElement.childNodes.item(0).childNodes.item(2).text;
year = xmlDoc.documentElement.childNodes.item(0).childNodes.item(3).text; //הצגת הנתונים
document.write(“<h3>Title: “ + title + “</h3>”);
document.write(“<b>Author: “ + author + “</b><br>”);
document.write(“Pages: “ + pages + “<br>”);
document.write(“Year: “ + year);
</script>
|
|
שימו לב, שבכדי לפנות אל תוכן של ענף משנה של book, עלינו לכתוב את השורה הבאה:
1
|
xmlDoc.documentElement.childNodes.item(0).childNodes.item(0).text;
|
|
ניתן לקצר זאת ע”י שימוש במשתנה שיצביע על אובייקט השורש, או כל ענף משנה בקובץ ה-XML.
בדוגמא זו נשתמש במשתנה שיצביע על אובייקט השורש:
1
2
3
4
5
6
|
var XMLroot = xmlDoc.documentElement;title = XMLroot.childNodes.item(0).childNodes.item(0).text;
author = XMLroot.childNodes.item(0).childNodes.item(1).text;
pages = XMLroot.childNodes.item(0).childNodes.item(2).text;
year = XMLroot.childNodes.item(0).childNodes.item(3).text;
|
|
הצגת כל הנתונים בטבלה
ניצור קובץ html חדש ונוסיף סקריפט שייטען את קובץ ה-XML ב-body:
1
2
3
4
5
|
<script>
//יצירת אובייקט חדש וטעינת הקובץ
var xmlDoc = new ActiveXObject(“microsoft.XMLDOM”);
xmlDoc.async = false;
xmlDoc.load(“library.xml”)
|
|
נוסיף מצביע לענף השורש:
1
|
var XMLroot = xmlDoc.documentElement;
|
|
ניצור טבלה חדשה שתכיל את העמודות – Title, Author, Pages, Year:
1
2
3
|
document.write(“<table border=’1′>n<tr>n”)
document.write(“<th>Title</th><th>Author</th><th>Pages</th><th>Year</th>n”)
document.write(“</tr>n”)
|
|
נשתמש בלולאת for בכדי לעבור על כל הענפים.
בכדי לקבל את מספר הענפים, נשתמש בתכונה:
1
|
xmlDoc.documentElement.childNodes.length;
|
|
חשוב לזכור, כי שיטה זאת מחזירה את מספר הענפים, ולכן מספר הענף האחרון יהיה:
1
|
xmlDoc.documentElement.childNodes.length–1;
|
|
(מכיוון שמספור הענפים מתחיל מ-0)
ניצור לולאה שתעבור על כל הענפים:
1
2
3
4
|
//JavaScript
for (i = 0; i <= XMLroot.childNodes.length–1; i++) {}
|
|
1
2
3
4
|
‘VBScript
For i = 0 To XMLroot.childNodes.length-1Next
|
|
נוסיף קוד להצגת הנתונים בתוך לולאת ה-for שיצרנו:
1
2
3
4
5
6
|
document.write(“<tr>n”);
document.write(“<td>”+XMLroot.childNodes.item(i).childNodes.item(0).text+“</td>”);
document.write(“<td>”+XMLroot.childNodes.item(i).childNodes.item(1).text+“</td>”);
document.write(“<td>”+XMLroot.childNodes.item(i).childNodes.item(2).text+“</td>”);
document.write(“<td>”+XMLroot.childNodes.item(i).childNodes.item(3).text+“</td>”);
document.write(“</tr>”);
|
|
נסגור את הטבלה ונסיים את הסקריפט:
1
2
|
document.write(“</able>”);
</script>
|
|
הקוד במלואו:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<html>
<head>
<title>Library</title>
</head>
<body>
<script>
var xmlDoc = new ActiveXObject(“microsoft.XMLDOM”);
xmlDoc.async = false;
xmlDoc.load(“library.xml”) //טעינת הקובץ
var XMLroot = xmlDoc.documentElement;
document.write(“<table border=’1′><tr>n”)
document.write(“<th>Title</th><th>Author</th><th>Pages</th><th>Year</th>n”)
document.write(“</tr>n”)
for (i = 0; i <= XMLroot.childNodes.length–1; i++) {
document.write(“<tr>n”);
document.write(“<td>”+XMLroot.childNodes.item(i).childNodes.item(0).text+“</td>”);
document.write(“<td>”+XMLroot.childNodes.item(i).childNodes.item(1).text+“</td>”);
document.write(“<td>”+XMLroot.childNodes.item(i).childNodes.item(2).text+“</td>”);
document.write(“<td>”+XMLroot.childNodes.item(i).childNodes.item(3).text+“</td>”);
document.write(“</tr>”);
}
document.write(“</table>”);
</script>
</body>
</html>
|
|
שימוש ב-innerText
ניתן להשתמש ב-span ובשיטה innerText בכדי להכניס את תוכן קובץ ה- XML לתוך מסמך HTML.
נפתח קובץ HTML חדש, ונוסיף לו spanים:
1
2
3
4
5
6
7
8
9
10
11
|
<html>
<head>
<title>Library</title>
</head>
<body>
<b>Title:</b> <span id=“title”></span><br>
<b>Author:</b> <span id=“author”></span><br>
<b>Pages:</b> <span id=“pages”></span><br>
<b>Year:</b> <span id=“year”></span><br>
</body>
</html>
|
|
נוסיף סקריפט ב- head שיטען את קובץ ה-XML ויכניס את הנתונים לתוך ה-span.
1
2
3
4
5
6
7
8
|
<script>
//יצירת אובייקט חדש וטעינת הקובץ
var xmlDoc = new ActiveXObject(“microsoft.XMLDOM”);
xmlDoc.async = false;
xmlDoc.load(“library.xml”)//יצירת מצביע לאובייקט השורש
var XMLroot = xmlDoc.documentElement;
|
|
לפני שהקוד יבצע את השימוש ב – innerText, צריך לדאוג שכל ה-span יטענו, אחרת הסקריפט ינסה להכניס טקסט לאובייקט שלא קיים ויחזיר שגיאה. לכן נשתמש בפונקציה שנקרא לה לאחר סיום טעינת קובץ ה-HTML.
1
2
3
4
5
6
|
function readXML() {
title.innerText = XMLroot.childNodes.item(0).childNodes.item(0).text;
author.innerText = XMLroot.childNodes.item(0).childNodes.item(1).text;
pages.innerText = XMLroot.childNodes.item(0).childNodes.item(2).text;
year.innerText = XMLroot.childNodes.item(0).childNodes.item(3).text;
}
|
|
נסגור את הסקריפט וכדי לקרוא לפונקציה לאחר טעינת הקובץ, נשתמש באירוע onLoad:
1
2
3
4
|
</script><body onLoad=“readXML()”> |
|
זהו, למדנו במאמר זה לקרוא קובץ XML עם האובייקט microsoft.XMLDOM בשתי שיטות שונות:
- ע”י documen.write.
- ע”י שימוש ב-innerText.
בהצלחה!
תגובות בפייסבוק