Firefox 1.5 中的 XML,第 3 部分:利用 JavaScript 处理 Firefox 中的 XML

59 篇文章 0 订阅
这是 “ Firefox 1.5 中的 XML” 系列中的第三篇文章,您将学习在 Mozilla Firefox 中使用 JavaScript 实现处理 XML。在前两篇文章 Firefox 1.5 中的 XML,第 1 部分:XML 特性概述Firefox 1.5 中的 XML,第 2 部分:基本 XML 处理 中,我们了解了 Mozilla Firefox 中各种与 XML 相关的工具,以及 XML 解析的基本概念、级联样式表(CSS)和 XSLT 样式表调用。

了解了 XML 在 Firefox 浏览器中的基本显示和样式后,下一个要关注的功能就是脚本。本文中,我将展示利用 JavaScript 代码处理 XML 这一基本概念。本文包含的所有代码示例和屏幕截图都是在 Ubuntu Linux® 系统中使用 Firefox 1.5.0.4 创建和测试的,配置文件没有修改过(即没有扩展,保留了安装时的默认选项)。如果要编写用于 XML 处理的跨浏览器代码,可能必须使用其他的浏览器嗅探技术,但是,我没有在本文介绍这些技术。

加载 XML 文件

您可以使用 Web 页面内嵌的 JavaScript 代码加载 XML 文档。我将从一个 HTML Web 页面示例入手,该页面加载一个简单的 XML 邮件列表格式用于动态更新,要加载的 XML 文档如 清单 1 所示(labels.xml)。


清单 1.(labels.xml)地址标签 XML
				<?xml version="1.0" encoding="iso-8859-1"?>
<labels>
<label id='ep' added="2003-06-10">
<name>Ezra Pound</name>
<address>
<street>45 Usura Place</street>
<city>Hailey</city>
<province>ID</province>
</address>
</label>
<label id='tse' added="2003-06-20">
<name>Thomas Eliot</name>
<address>
<street>3 Prufrock Lane</street>
<city>Stamford</city>
<province>CT</province>
</address>
</label>
<label id="lh" added="2004-11-01">
<name>Langston Hughes</name>
<address>
<street>10 Bridge Tunnel</street>
<city>Harlem</city>
<province>NY</province>
</address>
</label>
<label id="co" added="2004-11-15">
<name>Christopher Okigbo</name>
<address>
<street>7 Heaven's Gate</street>
<city>Idoto</city>
<province>Anambra</province>
</address>
</label>
</labels>


清单 2 是仅包括一个链接的 HTML 页面,链接显示 “Click here to load addresses”。单击链接,地址标签的信息被添加到页面中。


清单 2. HTML 页面利用 JavaScript 加载 XML 用于动态更新
				<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<title>Address book</title>
<script type="application/javascript">
var ELEMENT_NODE = 1
//TEXT_NODE

function loadAddresses()
{
xmlDoc = document.implementation.createDocument("", "", null);
xmlDoc.onload = writeList;
xmlDoc.load("labels.xml");
}

function writeList()
{
var labels = xmlDoc.getElementsByTagName('label');
var ol = document.createElement('OL');

for (i=0; i < labels.length; i++)
{
var li = document.createElement('LI');
for (j=0; j < labels[i].childNodes.length; j++)
{
if (labels[i].childNodes[j].nodeType != ELEMENT_NODE) continue;
var cdata = document.createTextNode(
labels[i].childNodes[j].firstChild.nodeValue);
li.appendChild(cdata);
}
var labelId = document.createTextNode('(' +
labels[i].getAttribute('id') + ')');
li.appendChild(labelId);
ol.appendChild(li);
}
document.getElementById('updateTarget').appendChild(ol);
}
</script>
</head>
<body id='updateTarget'>
<p>
<a href="javascript:loadAddresses()">Click here to load addresses</a>
</p>
</body>
</html>


script 元素体现动态特性,定义一个 JavaScript 函数 loadAddresses,这个函数将被 HTML 中的链接调用。该函数创建一个空文档实例,然后使用 load 函数读入 清单 1(labels.xml)。load 函数是异步执行的,因此,在 XML 文档读入的同时,脚本可跳到下一行执行,使您能够在 XML 加载开始后就使用一个触发函数开始运行。因此,我为一个独立的函数 writeList 设置 onload 属性。该函数使用方便的文档对象模型(Document Object Model, DOM)的 getElementsByTagName 方法遍历标签。如果 XML 文档使用名称空间,那么要使用 getElementsByTagNameNS 表单而不是上面的方法,并将名称空间指定为第一个参数。在下一节中,您将会看到一个这样的例子。在 清单 2 中,只使用 DOM 的基本层(叫做 DOM Level 1)进行 XML 处理。对于支持名称空间的应用程序,需要使用 DOM Level 2,它扩展了许多 Level 1 方法,可以支持名称空间。清单 2 创建了一个表示有序列表的子树,将 HTML 主文档作为工厂(factory)来创建节点。这样,生成的子树可以插入到 HTML 主文档中。清单 2 使用普通模式读取源 XML 树,然后将相应的节点添加到输出 HTML 子树中。

对每个 label 元素执行循环语句 labels[i].childNodes,查找 nameaddress 子节点。为避免对文本节点的子节点执行操作,使用 nodeType 测试。使用 firstChild.nodeValue 方法进行访问获得 name 元素的子文本。对 address 元素来说,第一个子节点是空格。您不能访问 address 的子节点的任何文本内容。使用 getAttribute 方法可以访问 ID。将收集到的所有文本添加到列表项中。编译完所有的列表项元素之后,使用 appendChild 方法更新包含子树的 HTML 文档。可以使用 updateTarget ID 标记将添加该子树的元素(body)。当第一次在 Firefox 中加载该 HTML 时,只能看到如 图 1 所示的链接。


图 1. 加载清单 2 之后的浏览器显示
 

本文转自IBM Developerworks中国

      请点击此处查看全文

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值