这是 “Firefox 1.5 中
![](/icons/41171de.gif)
XML” 系列中
![](/icons/41171de.gif)
第 3篇文章
![](/icons/41171dou.gif)
您将学习在 Mozilla Firefox 中使用 JavaScript 实现处理 XML
![](/icons/41171dou2.gif)
在前两篇文章 Firefox 1.5 中
![](/icons/41171de.gif)
XML
![](/icons/41171dou.gif)
第 1 部分:XML 特性概述 和 Firefox 1.5 中
![](/icons/41171de.gif)
XML
![](/icons/41171dou.gif)
第 2 部分:基本 XML 处理 中
![](/icons/41171dou.gif)
我们了解了 Mozilla Firefox 中各种和 XML 相关
![](/icons/41171de.gif)
工具
![](/icons/41171dou.gif)
以及 XML 解析
![](/icons/41171de.gif)
基本概念、级联样式表(CSS)和 XSLT 样式表
![](/icons/41171diaoyong.gif)
了解了 XML 在 Firefox 浏览器中
![](/icons/41171de.gif)
基本显示和样式后
![](/icons/41171dou.gif)
下
![](/icons/41171yi.gif)
个要关注
![](/icons/41171de.gif)
功能就是脚本
![](/icons/41171dou2.gif)
本文中
![](/icons/41171dou.gif)
我将展示利用 JavaScript 代码处理 XML 这
![](/icons/41171yi.gif)
基本概念
![](/icons/41171dou2.gif)
本文包含
![](/icons/41171de.gif)
所有代码举例和屏幕截图都是在 Ubuntu Linux® 系统中使用 Firefox 1.5.0.4 创建和测试
![](/icons/41171de.gif)
![](/icons/41171dou.gif)
配置文件没有修改过(即没有扩展
![](/icons/41171dou.gif)
保留了安装时
![](/icons/41171de.gif)
默认选项)
![](/icons/41171dou2.gif)
如果要编写用于 XML 处理
![](/icons/41171de.gif)
跨浏览器代码
![](/icons/41171dou.gif)
可能必须使用其他
![](/icons/41171de.gif)
浏览器嗅探技术
![](/icons/41171dou.gif)
但是
![](/icons/41171dou.gif)
我没有在本文介绍这些技术
加载 XML 文件
您可以使用 Web 页面内嵌
![](/icons/41171de.gif)
JavaScript 代码加载 XML 文档
![](/icons/41171dou2.gif)
我将从
![](/icons/41171yi.gif)
个 HTML Web 页面举例入手
![](/icons/41171dou.gif)
该页面加载
![](/icons/41171yi.gif)
个简单
![](/icons/41171de.gif)
XML 邮件列表格式用于动态更新
![](/icons/41171dou.gif)
要加载
![](/icons/41171de.gif)
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 是仅包括
![](/icons/41171yi.gif)
个链接
![](/icons/41171de.gif)
HTML 页面
![](/icons/41171dou.gif)
链接显示 “Click here to load addresses”
![](/icons/41171dou2.gif)
单击链接
![](/icons/41171dou.gif)
地址标签
![](/icons/41171de.gif)
信息被添加到页面中
清单 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; char
![](/icons/41171set.gif)
=iso-8859-1" http-equiv="Content-Type"> <title>Address book</title> <script type="application/javascript">var ELEMENT_NODE = 1//TEXT_NODEfunction loadAddresses
![](/icons/41171kh.gif)
{ xmlDoc = document.implementation.createDocument("", "", null); xmlDoc.onload = writeList; xmlDoc.load("labels.xml");}function writeList
![](/icons/41171kh.gif)
{ var labels = xmlDoc.getElementsByTagName('label'); var ol = document.createElement('OL'); for (i=0; i < labels.length; i
![](/icons/41171jiajia.gif)
) { var li = document.createElement('LI'); for (j=0; j < labels[i].childNodes.length; j
![](/icons/41171jiajia.gif)
) {
![](/icons/41171if.gif)
(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> <aloadAddresses
![](/icons/41171kh.gif)
">Click here to load addresses</a> </p> </body></html>
script 元素体现动态特性
![](/icons/41171dou.gif)
定义
![](/icons/41171yi.gif)
个 JavaScript
![](/icons/41171hanshu.gif)
loadAddresses
![](/icons/41171dou.gif)
这个
![](/icons/41171hanshu.gif)
将被 HTML 中
![](/icons/41171de.gif)
链接
![](/icons/41171diaoyong.gif)
![](/icons/41171dou2.gif)
该
![](/icons/41171hanshu.gif)
创建
![](/icons/41171yi.gif)
个空文档例子
![](/icons/41171dou.gif)
然后使用 load
![](/icons/41171hanshu.gif)
读入 清单 1(labels.xml)
![](/icons/41171dou2.gif)
load
![](/icons/41171hanshu.gif)
是异步执行
![](/icons/41171de.gif)
![](/icons/41171dou.gif)
因此
![](/icons/41171dou.gif)
在 XML 文档读入
![](/icons/41171de.gif)
同时
![](/icons/41171dou.gif)
脚本可跳到下
![](/icons/41171yi.gif)
行执行
![](/icons/41171dou.gif)
使您能够在 XML 加载开始后就使用
![](/icons/41171yi.gif)
个触发
![](/icons/41171hanshu.gif)
开始运行
![](/icons/41171dou2.gif)
因此
![](/icons/41171dou.gif)
我为
![](/icons/41171yi.gif)
个独立
![](/icons/41171de.gif)
![](/icons/41171hanshu.gif)
writeList 设置 onload 属性
![](/icons/41171dou2.gif)
该
![](/icons/41171hanshu.gif)
使用方便
![](/icons/41171de.gif)
文档对象模型(Document Object Model, DOM)
![](/icons/41171de.gif)
getElementsByTagName 思路方法遍历标签
![](/icons/41171dou2.gif)
如果 XML 文档使用名称空间
![](/icons/41171dou.gif)
那么要使用 getElementsByTagNameNS 表单而不是上面
![](/icons/41171de.gif)
思路方法
![](/icons/41171dou.gif)
并将名称空间指定为第
![](/icons/41171yi.gif)
个参数
![](/icons/41171dou2.gif)
在下
![](/icons/41171yi.gif)
节中
![](/icons/41171dou.gif)
您将会看到
![](/icons/41171yi.gif)
个这样
![](/icons/41171de.gif)
例子
![](/icons/41171dou2.gif)
在 清单 2 中
![](/icons/41171dou.gif)
只使用 DOM
![](/icons/41171de.gif)
基本层(叫做 DOM Level 1)进行 XML 处理
![](/icons/41171dou2.gif)
对于支持名称空间
![](/icons/41171de.gif)
应用
![](/icons/41171chengxu.gif)
![](/icons/41171dou.gif)
需要使用 DOM Level 2
![](/icons/41171dou.gif)
它扩展了许多 Level 1 思路方法
![](/icons/41171dou.gif)
可以支持名称空间
![](/icons/41171dou2.gif)
清单 2 创建了
![](/icons/41171yi.gif)
个表示有序列表
![](/icons/41171de.gif)
子树
![](/icons/41171dou.gif)
将 HTML 主文档作为工厂(factory)来创建节点
![](/icons/41171dou2.gif)
这样
![](/icons/41171dou.gif)
生成
![](/icons/41171de.gif)
子树可以插入到 HTML 主文档中
![](/icons/41171dou2.gif)
清单 2 使用普通模式读取源 XML 树
![](/icons/41171dou.gif)
然后将相应
![](/icons/41171de.gif)
节点添加到输出 HTML 子树中
对每个 label 元素执行循环语句 labels[i].childNodes
![](/icons/41171dou.gif)
查找 name 和 address 子节点
![](/icons/41171dou2.gif)
为避免对文本节点
![](/icons/41171de.gif)
子节点执行操作
![](/icons/41171dou.gif)
使用 nodeType 测试
![](/icons/41171dou2.gif)
使用 firstChild.nodeValue 思路方法进行访问获得 name 元素
![](/icons/41171de.gif)
子文本
![](/icons/41171dou2.gif)
对 address 元素来说
![](/icons/41171dou.gif)
第
![](/icons/41171yi.gif)
个子节点是空格
![](/icons/41171dou2.gif)
您不能访问 address
![](/icons/41171de.gif)
子节点
![](/icons/41171de.gif)
任何文本内容
![](/icons/41171dou2.gif)
使用 getAttribute 思路方法可以访问 ID
![](/icons/41171dou2.gif)
将收集到
![](/icons/41171de.gif)
所有文本添加到列表项中
![](/icons/41171dou2.gif)
编译完所有
![](/icons/41171de.gif)
列表项元素的后
![](/icons/41171dou.gif)
使用 appendChild 思路方法更新包含子树
![](/icons/41171de.gif)
HTML 文档
![](/icons/41171dou2.gif)
可以使用 updateTarget ID 标记将添加该子树
![](/icons/41171de.gif)
元素(body)