Let's start by looking at a quick example. This link will open up an XML file directly (ex1.xml).
The code for this XML file is:
<?xml version="1.0"?>
<COURSE>
<DEPT>CIS</DEPT>
<NUMBER>380</NUMBER>
<SECTION>01</SECTION>
<INSTRUCTOR>John Avitabile</INSTRUCTOR>
</COURSE>
Here's a slightly more complex example. The file is ex2.xml.
The code for this XML file is:
<?xml version="1.0"?>
<LOAD>
<COURSE>
<DEPT>CIS</DEPT>
<NUMBER>380</NUMBER>
<SECTION>01</SECTION>
<INSTRUCTOR>John Avitabile</INSTRUCTOR>
</COURSE>
<COURSE>
<DEPT>CIS</DEPT>
<NUMBER>380</NUMBER>
<SECTION>E2</SECTION>
<INSTRUCTOR>John Avitabile</INSTRUCTOR>
</COURSE>
<COURSE>
<DEPT>CIS</DEPT>
<NUMBER>413</NUMBER>
<SECTION>E1</SECTION>
<INSTRUCTOR>John Avitabile</INSTRUCTOR>
</COURSE>
</LOAD>
As you can see, Internet Explorer "understands" that how an XML file should be displayed.
Of course these first two examples just list the content of the XML document. The next example will have an HTML file "read" the contents of the first XML file, and display it in a variety of ways. The code for this example is:
<HTML>
<HEAD>
<TITLE>Example 2</TITLE>
<SCRIPT LANGUAGE="JavaScript">
var xmlDoc =
new ActiveXObject("Msxml2.DOMDocument.3.0");
xmlDoc.load("ex1.xml");
function loadDoc()
{
if (xmlDoc.readyState
== "4")
start()
else
window.setTimeout("loadDoc()",
1000);
}
function start()
{
var rootElem = xmlDoc.documentElement;
var classs = rootElem.childNodes.item(0).text;
var section = rootElem.childNodes.item(1).text;
var teacher = rootElem.childNodes.item(2).text;
alert(classs + " section
" + section + " taught by " + teacher);
document.writeln("The
data is: <P>");
document.writeln(classs
+ " section " + section);
document.writeln(" taught
by " + teacher);
document.writeln("<P>
As a table:");
document.writeln("<TABLE
BORDER=2> <TR>");
document.writeln("<TD>"+
classs + "</TD>");
document.writeln("<TD>"
+ section + "</TD>");
document.writeln("<TD>"
+ teacher + "</TD>");
document.writeln("</TR>
</TABLE>");
}
</SCRIPT>
<SCRIPT>
loadDoc();
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>
The next example will use the slightly more elaborate ex2.htm file.
<HTML>
<HEAD>
<TITLE>Example 3</TITLE>
<SCRIPT LANGUAGE="JavaScript">
var xmlDoc
= new ActiveXObject("Msxml2.DOMDocument.3.0");
xmlDoc.load("ex2.xml");
function loadDoc()
{
if (xmlDoc.readyState
== "4")
start()
else
window.setTimeout("loadDoc()",
1000);
}
function start()
{
var rootElem = xmlDoc.documentElement;
document.writeln("<TABLE
BORDER=2>");
document.writeln("<TR><TH>Class</TH><TH>Section</TH>");
document.writeln("<TH>Instructor</TH></TR>");
for (i = 0; i < rootElem.childNodes.length;
i++)
{
var
course = rootElem.childNodes.item(i);
var
classs = course.childNodes.item(0).text;
var
section = course.childNodes.item(1).text;
var
teacher = course.childNodes.item(2).text;
document.writeln("<TR>");
document.writeln("<TD>"+
classs + "</TD>");
document.writeln("<TD>"
+ section + "</TD>");
document.writeln("<TD>"
+ teacher + "</TD>");
document.writeln("</TR>");
}
document.writeln("</TABLE>");
}
</SCRIPT>
<SCRIPT>
loadDoc();
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>
And this example does it in a more generic way...
<HTML>
<HEAD>
<TITLE>Example 4</TITLE>
<SCRIPT LANGUAGE="JavaScript">
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");
xmlDoc.load("ex2.xml");
var fieldDoc = = new ActiveXObject("Msxml2.DOMDocument.3.0");
fieldDoc.load("ex3.xml");
function loadDoc()
{
if (xmlDoc.readyState
== "4" && fieldDoc.readyState == "4")
start()
else
window.setTimeout("loadDoc()",
1000);
}
function start()
{
var rootElem = xmlDoc.documentElement;
var rootField = fieldDoc.documentElement;
document.writeln("<TABLE
BORDER=2>");
document.writeln("<TR>");
for (i = 0; i < rootField.childNodes.length;
i++)
{
var f1 =
rootField.childNodes.item(i).text;
document.writeln("<TH>"
+ f1 + "</TH>");
}
document.writeln("</TR>");
for (i = 0; i < rootElem.childNodes.length;
i++)
{
var
course = rootElem.childNodes.item(i);
document.writeln("<TR>");
for
(j = 0; j < course.childNodes.length; j++)
{
var x = course.childNodes.item(j).text;
document.writeln("<TD>"+ x + "</TD>");
}
document.writeln("</TR>");
}
document.writeln("</TABLE>");
}
</SCRIPT>
<SCRIPT>
loadDoc();
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>
This is what the file ex3.xml looks like:
<?xml version="1.0"?>
<FIELDS>
<FIELD1>Class</FIELD1>
<FIELD2>Section</FIELD2>
<FIELD3>Instructor</FIELD3>
</FIELDS>
And this example does it with just one XML file..
<HTML>
<HEAD>
<TITLE>Example 5</TITLE>
<SCRIPT LANGUAGE="JavaScript">
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");
xmlDoc.load("ex2.xml");
function loadDoc()
{
if (xmlDoc.readyState
== "4")
start()
else
window.setTimeout("loadDoc()",
1000);
}
function start()
{
var rootElem = xmlDoc.documentElement;
document.writeln("<TABLE
BORDER=2>");
document.writeln("<TR>");
var heading = rootElem.childNodes.item(0);
for (j = 0; j < heading.childNodes.length;
j++)
{
var x =
heading.childNodes.item(j).nodeName;
document.writeln("<TH>"+
x + "</TH>");
}
document.writeln("</TR>");
for (i = 0; i < rootElem.childNodes.length;
i++)
{
var
course = rootElem.childNodes.item(i);
document.writeln("<TR>");
for
(j = 0; j < course.childNodes.length; j++)
{
var x = course.childNodes.item(j).text;
document.writeln("<TD>"+ x + "</TD>");
}
document.writeln("</TR>");
}
document.writeln("</TABLE>");
}
</SCRIPT>
<SCRIPT>
loadDoc();
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>
Here's another example. This example uses the XML Data Source Object. This time data is loaded one record at a time...
Notice the use of the DIV and SPAN containers.
The SPAN tag has attributes STYLE (sets the look), ID (names the object), DATASRC (the XML DSO object), and DATAFLD (the field).
The STYLE attribute lets you set how text looks. You use key:value pairs.
Possible values for key are:
| Key | Possible value |
| color | blue |
| font-weight | bold |
| font-style | italic |
| font-size | 24 |
| background-color | yellow |
| margin-left | 1in |
| margin-right | 1in |
| border-color | red |
| border-width | 8 |
| border-style | solid |
| text-align | center |
| position | absolute |
| left | 200 |
| top | 100 |
| visibility | (hidden or visible) |
Useful links about style are http://www.w3.org/TR/WD-css1.html and http://www.w3.org/TR/WD-CSS2/
<HTML>
<HEAD>
<SCRIPT>
function loadDSO()
{
var xmlDso = xmldso.XMLDocument;
xmlDso.load("ex2a.xml");
}
</SCRIPT>
</HEAD>
<BODY onLoad="loadDSO();">
<OBJECT WIDTH="0" HEIGHT="0"
CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"
ID="xmldso">
</OBJECT>
<DIV ID="catalog">
<SPAN STYLE="font-weight:bold">Class:
</SPAN>
<SPAN ID="class" DATASRC=#xmldso
DATAFLD="CLASS" STYLE="color:blue">
</SPAN>
<BR>
<SPAN STYLE="font-weight:bold">Section:
</SPAN>
<SPAN ID="section" DATASRC=#xmldso
DATAFLD="SECTION" STYLE="color:blue">
</SPAN>
<BR>
<SPAN STYLE="font-weight:bold">Instructor:
</SPAN>
<SPAN ID="instructor" DATASRC=#xmldso
DATAFLD="INSTRUCTOR" STYLE="color:blue">
</SPAN>
<BR>
</DIV>
<P>
<INPUT TYPE=button VALUE="Previous
Class"
ONCLICK="xmldso.recordset.moveprevious()">
<INPUT TYPE=button VALUE="Next
Class"
ONCLICK="xmldso.recordset.movenext()">
</BODY>
</HTML>
Here's another example. Again, data is loaded into a table...
The THEAD container ensures that there will be only one heading per table. Using the <TR> container would have given you one heading row per record.
Notice that a TABLE can have a DATASRC attribute.
And the DIV container can have a DATAFLD attribute.
<HTML>
<HEAD>
<SCRIPT>
function loadDSO()
{
var xmlDso = xmldso.XMLDocument;
xmlDso.load("ex2a.xml");
}
</SCRIPT>
</HEAD>
<BODY onLoad="loadDSO();">
<OBJECT WIDTH="0" HEIGHT="0"
CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"
ID="xmldso">
</OBJECT>
<TABLE DATASRC=#xmldso BORDER="1" CELLSPACING="5" CELLPADDING="2">
<THEAD>
<TH>Class</TH>
<TH>Section</TH>
<TH>Instructor</TH>
</THEAD>
<TR ALIGN="center">
<TD><DIV DATAFLD="CLASS"></TD>
<TD><DIV DATAFLD="SECTION"></TD>
<TD><DIV DATAFLD="INSTRUCTOR"></TD>
</TR>
</TABLE>
</BODY>
</HTML>
Another example (ex8.htm) that uses ex8.xml
<HTML>
<HEAD>
<SCRIPT>
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");
xmlDoc.load("ex8.xml");
function getObj(elementID)
{
return document.getElementById(elementID);
}
function showForm()
{
f = getObj("form1");
f.style.visibility = "visible";
}
function showData()
{
d = getObj("data");
f = getObj("form1");
var rootElem = xmlDoc.documentElement;
var match = linearSearch(f, rootElem);
if (match == -1)
{
alert("Sorry, no match");
showForm();
return;
}
var myCourse = rootElem.childNodes.item(match);
makeNodes(myCourse, d);
f.style.visibility = "hidden";
d.style.visibility = "visible";
}
function linearSearch(f, rootElem)
{
var searchSection = f.section.value;
var searchClass = f.course.value;
for (i = 0; i < rootElem.childNodes.length; i++)
{
var course = rootElem.childNodes.item(i);
var thisClass = "";
var thisSection = "";
for (j = 0; j < course.childNodes.length; j++)
{
var nodeText = course.childNodes.item(j).text;
var nodeName = course.childNodes.item(j).nodeName;
if (nodeName == "CLASS") thisClass = nodeText;
if (nodeName == "SECTION") thisSection = nodeText;
}
if (thisSection == searchSection && thisClass == searchClass)
return i;
}
return -1;
}
function makeNodes(myCourse, d)
{
emptyNode(d);
for (i = 0; i < myCourse.childNodes.length; i++)
{
var nodeText = myCourse.childNodes.item(i).text;
var nodeName = myCourse.childNodes.item(i).nodeName;
d.appendChild(document.createTextNode(nodeName + ": " + nodeText));
d.appendChild(document.createElement("p"));
}
d.appendChild(document.createElement("<input type='button' " +
"value='Do Another Search' " +
"onClick='hideData();" +
"showForm()'>"));
}
function hideData()
{
d = getObj("data");
d.style.visibility = "hidden";
}
function getObj(elementID)
{
return document.getElementById(elementID);
}
function emptyNode(theNode)
{
for (i= theNode.childNodes.length - 1; i >=0; i--)
{
theNode.removeChild(theNode.childNodes[i]);
}
}
</SCRIPT>
<style type="text/css">
#form1 { position:absolute; x:0; y:0}
#data { position:absolute; x:0; y:0}
</style>
</HEAD>
<BODY onLoad="showForm();hideData()">
<OBJECT WIDTH="0" HEIGHT="0"
CLASSID="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"
ID="xmldso">
</OBJECT>
<FORM id="form1">
Enter course: <INPUT TYPE="text" name="course">
<BR>Enter section:<INPUT TYPE="text" name="section">
<BR><INPUT TYPE="button" VALUE="Find Information"
onClick='showData();'>
</FORM>
<DIV id="data">
<INPUT TYPE="button" VALUE="Do another search"
onClick='hideData();showForm();'>
</DIV>
</BODY>
</HTML>
And a variant on this: ex8a.htm
<HTML>
<HEAD>
<SCRIPT>
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");
xmlDoc.load("ex8.xml");
function getObj(elementID)
{
return document.getElementById(elementID);
}
function showForm()
{
f = getObj("form1");
f.style.visibility = "visible";
}
function showData()
{
d = getObj("data");
f = getObj("form1");
var rootElem = xmlDoc.documentElement;
var match = linearSearch(f, rootElem);
makeNodes(match, rootElem, d);
f.style.visibility = "hidden";
d.style.visibility = "visible";
}
function linearSearch(f, rootElem)
{
var searchSection = f.section.value;
var searchClass = f.course.value;
var A = new Array();
var count = 0;
for (i = 0; i < rootElem.childNodes.length; i++)
{
var course = rootElem.childNodes.item(i);
var thisClass = "";
for (j = 0; j < course.childNodes.length; j++)
{
var nodeText = course.childNodes.item(j).text;
var nodeName = course.childNodes.item(j).nodeName;
if (nodeName == "CLASS") thisClass = nodeText;
}
if (thisClass == searchClass)
{
A[count] = i;
count++;
}
}
return A;
}
function makeNodes(match, rootElem, d)
{
emptyNode(d);
for (j = 0; j < match.length; j++)
{
var myCourse = rootElem.childNodes.item(match[j]);
for (i = 0; i < myCourse.childNodes.length; i++)
{
var nodeText = myCourse.childNodes.item(i).text;
var nodeName = myCourse.childNodes.item(i).nodeName;
d.appendChild(document.createTextNode(nodeName + ": " + nodeText));
d.appendChild(document.createElement("p"));
}
}
d.appendChild(document.createElement("<input type='button' " +
"value='Do Another Search' " +
"onClick='hideData();" +
"showForm()'>"));
}
function hideData()
{
d = getObj("data");
d.style.visibility = "hidden";
}
function getObj(elementID)
{
return document.getElementById(elementID);
}
function emptyNode(theNode)
{
for (i= theNode.childNodes.length - 1; i >=0; i--)
{
theNode.removeChild(theNode.childNodes[i]);
}
}
</SCRIPT>
<style type="text/css">
#form1 { position:absolute; x:0; y:0}
#data { position:absolute; x:0; y:0}
</style>
</HEAD>
<BODY onLoad="showForm();hideData()">
<FORM id="form1">
Enter course: <INPUT TYPE="text" name="course">
<BR>Enter section:<INPUT TYPE="text" name="section">
<BR><INPUT TYPE="button" VALUE="Find Information"
onClick='showData();'>
</FORM>
<DIV id="data">
<INPUT TYPE="button" VALUE="Do another search"
onClick='hideData();showForm();'>
</DIV>
</BODY>
</HTML>