本文介绍如何在Internet Explorer中利用ActiveX控件MSXML2.DOMDocument.3.0加载并解析XML文档。通过JavaScript脚本实现XML节点的选择与遍历,结合HTML表单展示数据,并提供向前和向后浏览记录的功能,帮助用户在网页中直观操作XML数据。
IE中通过ActiveX访问XML数据
在当前的网络浏览器生态中,Internet Explorer (IE) 曾是Windows操作系统下的标准软件,广泛存在于各类机器中。微软通过ActiveX控件技术,将IE的功能与成熟的XML处理技术相结合,为XML数据的处理提供了支持。
本文将详细阐述如何在IE浏览器中利用ActiveX功能来访问和解析XML文档,从而允许用户通过网页界面直接操作XML数据。
网络浏览
我们从一个标准的顺序文档开始,如表A所示。该文档包含简单的顺序数据,旨在供网络用户浏览。除了展示数据外,我们还提供了一个简单的用户界面,使用户能够通过该界面浏览XML文档。
表A: order.xml
<?xml version="1.0" ?>
<Order>
<Account>9900234</Account>
<Item id="1">
<SKU>1234</SKU>
<PricePer>5.95</PricePer>
<Quantity>100</Quantity>
<Subtotal>595.00</Subtotal>
<Description>Super Widget Clamp</Description>
</Item>
<Item id="2">
<SKU>6234</SKU>
<PricePer>22.00</PricePer>
<Quantity>10</Quantity>
<Subtotal>220.00</Subtotal>
<Description>Mighty Foobar Flange</Description>
</Item>
<Item id="3">
<SKU>9982</SKU>
<PricePer>2.50</PricePer>
<Quantity>1000</Quantity>
<Subtotal>2500.00</Subtotal>
<Description>Deluxe Doohickie</Description>
</Item>
<Item id="4">
<SKU>3256</SKU>
<PricePer>389.00</PricePer>
<Quantity>1</Quantity>
<Subtotal>389.00</Subtotal>
<Description>Muckalucket Bucket</Description>
</Item>
<NumberItems>1111</NumberItems>
<Total>3704.00</Total>
<OrderDate>07/07/2002</OrderDate>
<OrderNumber>8876</OrderNumber>
</Order>
HTML表单界面设计
我们使用一个网络表单来访问这一XML文档。该表单将显示SKU、价格、数量、各部分的小计以及订单中每个选项的描述。此外,表单还包含向前和向后浏览记录的按钮。
网页构成
网页的核心部分在于表单,我们将使用表格以易读的方式在屏幕上显示数据。以下是显示HTML表格的代码片段:
<form>
<table border="0">
<tr><td>SKU</td><td><input type="text" name="SKU"></td></tr>
<tr><td>Price</td><td><input type="text" name="Price"></td></tr>
<tr><td>Quantity</td><td><input type="text" name="Quantity"></td></tr>
<tr><td>Total</td><td><input type="text" name="Total"></td></tr>
<tr><td>Description</td><td><input type="text"
name="Description"></td></tr>
</table>
<input type="button" value=" << " onClick="getDataPrev();"> <input
type="button" value=" >> " onClick="getDataNext();">
</form>
请注意,我们在表格下方包含了两个按钮,分别通过getDataNext()和getDataPrev()函数来浏览前一个和后一个记录,这也是本文讨论的重点。
JavaScript脚本实现逻辑
脚本部分
实际上,网页的核心不在于表单,而在于控制表单的脚本。我们的脚本包含四个部分:首先,通过加载XML文档来初始化网页;第二部分是导航到下一条记录;第三步是导航到上一条记录;第四部分是从XML文档中提取单个值。表B展示了网页的全部内容。
表B: jsxml.html
<html>
<head>
<script language="JavaScript">
<!--
var i = -1;
var orderDoc = new ActiveXObject("MSXML2.DOMDocument.3.0");
orderDoc.load("order.xml");
var items = orderDoc.selectNodes("/Order/Item");
function getNode(doc, xpath) {
var retval = "";
var value = doc.selectSingleNode(xpath);
if (value) retval = value.text;
return retval;
}
function getDataNext() {
i++;
if (i > items.length - 1) i = 0;
document.forms[0].SKU.value = getNode(orderDoc, "/Order/Item[" +
i + "]/SKU");
document.forms[0].Price.value = getNode(orderDoc, "/Order/Item["
+ i + "]/PricePer");
document.forms[0].Quantity.value = getNode(orderDoc,
"/Order/Item[" + i + "]/Quantity");
document.forms[0].Total.value = getNode(orderDoc, "/Order/Item["
+ i + "]/Subtotal");
document.forms[0].Description.value = getNode(orderDoc,
"/Order/Item[" + i + "]/Description");
}
function getDataPrev() {
i--;
if (i < 0) i = items.length - 1;
document.forms[0].SKU.value = getNode(orderDoc, "/Order/Item[" +
i + "]/SKU");
document.forms[0].Price.value = getNode(orderDoc, "/Order/Item["
+ i + "]/PricePer");
document.forms[0].Quantity.value = getNode(orderDoc,
"/Order/Item[" + i + "]/Quantity");
document.forms[0].Total.value = getNode(orderDoc, "/Order/Item["
+ i + "]/Subtotal");
document.forms[0].Description.value = getNode(orderDoc,
"/Order/Item[" + i + "]/Description");
}
// -->
</script>
</head>
<body onload="getDataNext()">
<h2>XML order Database</h2>
<form>
<table border="0">
<tr><td>SKU</td><td><input type="text" name="SKU"></td></tr>
<tr><td>Price</td><td><input type="text" name="Price"></td></tr>
<tr><td>Quantity</td><td><input type="text"
name="Quantity"></td></tr>
<tr><td>Total</td><td><input type="text" name="Total"></td></tr>
<tr><td>Description</td><td><input type="text"
name="Description"></td></tr>
</table>
<input type="button" value=" << " onClick="getDataPrev();"> <input
type="button" value=" >> " onClick="getDataNext();">
</form>
</body>
</html>
运行说明
该网页将传入并运行脚本的初始化代码。必须确保order.xml文档与jsxml.html位于相同的路径下。
初始化部分将创建一个新的ActiveX对象,实例化为MSXML2.DOMDocument.3.0对象类型,随后脚本将order.xml文档加载到内存中,并选择所有的/Order/Item节点。我们使用/Order/Item节点来识别文档中已包含的选项。
文档中的<body>标签包含onLoad属性,该属性使得网页在加载时调用getDataNext()进行初始化。此功能用于从XML文档中获取下一个值并显示在表单中。我们使用一个简单的索引来访问特定的选项。
向前(>>)和向后(<<)按钮使用相同的机制。首先响应onClick事件调用getDataNext()或getDataPrev(),这两个函数使用逻辑方法以避免访问超出文档范围的记录。