`
chaoyi
  • 浏览: 290402 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

第三十章:XML

 
阅读更多

学习要点:
1.IE 中的 XML
2.DOM2 中的 XML
3.跨浏览器处理 XML

随着互联网的发展,Web 应用程序的丰富,开发人员越来越希望能够使用客户端来操作 XML 技术。而 XML 技术一度成为存储和传输结构化数据的标准。所以,本章就详细探讨一下JavaScript 中使用 XML 的技术。
对于什么是 XML, 干什么用的, 这里就不在赘述了,在以往的 XHTML 或 PHP 课程都有涉及到,可以理解成一个微型的结构化的数据库,保存一些小型数据用的。
一.IE 中的 XML
在统一的正式规范出来以前, 浏览器对于 XML 的解决方案各不相同。 DOM2 级提出了动态创建 XML DOM 规范,DOM3 进一步增强了 XML DOM。所以,在不同的浏览器实现XML 的处理是一件比较麻烦的事情。
1.创建 XMLDOM 对象
IE 浏览器是第一个原生支持 XML 的浏览器, 而它是通过 ActiveX 对象实现的。 这个对象,只有 IE 有,一般是 IE9 之前采用。微软当年为了开发人员方便的处理 XML,创建了MSXML 库,但却没有让 Web 开发人员通过浏览器访问相同的对象。
var xmlDom = new ActiveXObject('MSXML2.DOMDocument');
ActiveXObject 类型

 

PS:在这六个版本中微软只推荐三种:
1.MSXML2.DOMDocument.6.0 最可靠最新的版本
2.MSXML2.DOMDocument.3.0 兼容性较好的版本
3.MSXML2.DOMDocument 仅针对 IE5.5 之前的版本
PS:这三个版本在不同的 windows 平台和浏览器下会有不同的支持,那么为了实现兼容,我们应该考虑这样操作:从 6.0->3.0->备用版本这条路线进行实现。

function createXMLDOM() {
var version = [
'MSXML2.DOMDocument.6.0',
'MSXML2.DOMDocument.3.0',
'MSXML2.DOMDocument'
];
for (var i = 0; i < version.length; i ++) {
try {
var xmlDom = new ActiveXObject(version[i]);
return xmlDom;
} catch (e) {
//跳过
}
}
throw new Error('您的系统或浏览器不支持 MSXML!'); //循环后抛出错误
}

 
2.载入 XML
如果已经获取了 XMLDOM 对象,那么可以使用 loadXML()和 load()这两个方法可以分别载入 XML 字符串或 XML 文件。

xmlDom.loadXML('<root version="1.0"><user>Lee</user></root>');
alert(xmlDom.xml);

 
PS:loadXML 参数直接就是 XML 字符串,如果想效果更好,可以添加换行符\n。.xml
属性可以序列化 XML,获取整个 XML 字符串。

xmlDom.load('test.xml'); //载入一个 XML 文件
alert(xmlDom.xml);

 
当你已经可以加载了 XML, 那么你就可以用之前学习的 DOM 来获取 XML 数据, 比如标签内的某个文本。

var user = xmlDom.getElementsByTagName('user')[0]; //获取<user>节点
alert(user.tagName); //获取<user>元素标签
alert(user.firstChild.nodeValue); //获取<user>里的值 Lee

 
DOM 不单单可以获取 XML 节点,也可以创建。

var email= xmlDom.createElement('email');
xmlDom.documentElement.appendChild(email);

 
3.同步及异步
load()方法是用于服务器端载入 XML 的,并且限制在同一台服务器上的 XML 文件。 那么在载入的时候有两种模式:同步和异步。
所谓同步:就是在加载 XML 完成之前,代码不会继续执行,直到完全加载了 XML 再返回。 好处就是简单方便、 坏处就是如果加载的数据停止响应或延迟太久, 浏览器会一直堵塞从而造成假死状态。

xmlDom.async = false; //设置同步, false, 可以用 PHP 测试假死

 
所谓异步:就是在加载 XML 时,JavaScript 会把任务丢给浏览器内部后台去处理,不会造成堵塞,但要配合 readystatechange 事件使用,所以,通常我们都使用异步方式。

xmlDom.async = true; //设置异步,默认

 
通过异步加载,我们发现获取不到 XML 的信息。原因是,它并没有完全加载 XML 就返回了,也就是说,在浏览器内部加载一点,返回一点,加载一点,返回一点。这个时候,我们需要判断是否完全加载,并且可以使用了,再进行获取输出。
XML DOM 中 readystatechange 事件

 

var xmlDom = createXMLDOM();
xmlDom.async = true; //异步,可以不写
xmlDom.onreadystatechange = function () {
if (xmlDom.readyState == 4) { //完全加载了,再去获取 XML
alert(xmlDom.xml);
}
}
xmlDom.load('test.xml'); //放在后面重点体现异步的作用

 
PS:可以通过 readyState 来了解事件的执行次数,将 load()方法放到最后不会因为代码的顺序而导致没有加载。 并且 load()方法必须放在 onreadystatechange 之后, 才能保证就绪状态变化时调用该事件处理程序,因为要先触发。用 PHP 来测试,在浏览器内部执行时,是否能操作,是否会假死。
PS:不能够使用 this,不能够用 IE 的事件处理函数,原因是 ActiveX 控件为了预防安全性问题。
PS:虽然可以通过 XML DOM 文档加载 XML 文件,但公认的还是 XMLHttpRequest对象比较好。这方面内容,我们在 Ajax 章节详细了解。
4.解析错误
在加载 XML 时, 无论使用 loadXML()或 load()方法, 都有可能遇到 XML 格式不正确的情况。为了解决这个问题,微软的 XML DOM 提供了 parseError 属性。
parseError 属性对象

 

if (xmlDom.parseError == 0) {
alert(xmlDom.xml);
} else {
throw new Error('错误行号:' + xmlDom.parseError.line +
'\n 错误代号:' + xmlDom.parseError.errorCode +
'\n 错误解释:' + xmlDom.parseError.reason);
}

 
二.DOM2 中的 XML
IE 可以实现了对 XML 字符串或 XML 文件的读取,其他浏览器也各自实现了对 XML处理功能。 DOM2 级在 document.implementaion 中引入了 createDocument()方法。 IE9、 Firefox、Opera、Chrome 和 Safari 都支持这个方法。
1.创建 XMLDOM 对象

var xmlDom = document.implementation.createDocument('','root',null); //创建 xmlDom
var user = xmlDom.createElement('user'); //创建 user 元素
xmlDom.getElementsByTagName('root')[0].appendChild(user); //添加到 root 下
var value = xmlDom.createTextNode('Lee'); //创建文本
xmlDom.getElementsByTagName('user')[0].appendChild(value); //添加到 user 下
alert(xmlDom.getElementsByTagName('root')[0].tagName);
alert(xmlDom.getElementsByTagName('user')[0].tagName);
alert(xmlDom.getElementsByTagName('user')[0].firstChild.nodeValue);

 
PS:由于 DOM2 中不支持 loadXML()方法,所以,无法简易的直接创建 XML 字符串。
所以,只能采用以上的做法。
PS:createDocument()方法需要传递三个参数,命名空间,根标签名和文档声明,由于JavaScript 管理命名空间比较困难,所以留空即可。文档声明一般根本用不到,直接 null 即可。命名空间和文档声明留空,表示创建 XMLDOM 对象不需要命名空间和文档声明。
PS:命名空间的用途是防止太多的重名而进行的分类,文档类型表明此文档符合哪种规范,而这里创建 XMLDOM 不需要使用这两个参数,所以留空即可。
2.载入 XML
DOM2 只支持 load()方法,载入一个同一台服务器的外部 XML 文件。当然,DOM2 也有 async 属性,来表面同步或异步,默认异步。
//同步情况下

var xmlDom = document.implementation.createDocument('','root',null);
xmlDom.async = false;
xmlDom.load('test.xml');
alert(xmlDom.getElementsByTagName('user')[0].tagName);

 
//异步情况下

var xmlDom = document.implementation.createDocument('','root',null);
xmlDom.async = true;
addEvent(xmlDom, 'load', function () { //异步直接用 onload 即可
alert(this.getElementsByTagName('user')[0].tagName);
});
xmlDom.load('test.xml');

 
PS: 不管在同步或异步来获取 load()方法只有 Mozilla 的 Firefox 才能支持, 只不过新版的 Opera 也是支持的,其他浏览器则不支持。
3.DOMParser 类型
由于 DOM2 没有 loadXML()方法直接解析 XML 字符串,所以提供了 DOMParser 类型来创建 XML DOM 对象。IE9、Safari、Chrome 和 Opera 都支持这个类型。

var xmlParser = new DOMParser(); //创建 DOMParser 对象
var xmlStr = '<user>Lee</user></root>'; //XML 字符串
var xmlDom = xmlParser.parseFromString(xmlStr, 'text/xml'); //创建 XML DOM 对象
alert(xmlDom.getElementsByTagName('user')[0].tagName); //获取 user 元素标签名

 
PS:XML DOM 对象是通过 DOMParser 对象中的 parseFromString 方法来创建的,两个
参数:XML 字符串和内容类型 text/xml。
4.XMLSerializer 类型
由于 DOM2 没有序列化 XML 的属性,所以提供了 XMLSerializer 类型来帮助序列化XML 字符串。IE9、Safari、Chrome 和 Opera 都支持这个类型。

var serializer = new XMLSerializer(); //创建 XMLSerializer 对象
var xml = serializer.serializeToString(xmlDom); //序列化 XML
alert(xml);

 
5.解析错误
在 DOM2 级处理 XML 发生错误时,并没有提供特有的对象来捕获错误,而是直接生成另一个错误的 XML 文档,通过这个文档可以获取错误信息。

var errors = xmlDom.getElementsByTagName('parsererror');
if (errors.length > 0) {
throw new Error('XML 格式有误:' + errors[0].textContent);
}

 
PS:errors[0].firstChild.nodeValue 也可以使用 errors[0].textContent 来代替。
三.跨浏览器处理 XML
如果要实现跨浏览器就要思考几个个问题: 1.load()只有 IE、 Firefox、Opera 支持, 所以无法跨浏览器;2.获取 XML DOM 对象顺序问题,先判断先进的 DOM2 的,然后再去判断落后的 IE;3.针对不同的 IE 和 DOM2 级要使用不同的序列化。4.针对不同的报错进行不同的报错机制。
//首先,我们需要跨浏览器获取 XML DOM

function getXMLDOM(xmlStr) {
var xmlDom = null;
if (typeof window.DOMParser != 'undefined') { //W3C
xmlDom = (new DOMParser()).parseFromString(xmlStr, 'text/xml');
var errors = xmlDom.getElementsByTagName('parsererror');
if (errors.length > 0) {
throw new Error('XML 解析错误:' + errors[0].firstChild.nodeValue);
}
} else if (typeof window.ActiveXObject != 'undefined') { //IE
var version = [
'MSXML2.DOMDocument.6.0',
'MSXML2.DOMDocument.3.0',
'MSXML2.DOMDocument'
];
for (var i = 0; i < version.length; i ++) {
try {
xmlDom = new ActiveXObject(version[i]);
} catch (e) {
//跳过
}
}
xmlDom.loadXML(xmlStr);
if (xmlDom.parseError != 0) {
throw new Error('XML 解析错误:' + xmlDom.parseError.reason);
}
} else {
throw new Error('您所使用的系统或浏览器不支持 XML DOM!');
}
return xmlDom;
}

 

//其次,我们还必须跨浏览器序列化 XML

function serializeXML(xmlDom) {
var xml = '';
if (typeof XMLSerializer != 'undefined') {
xml = (new XMLSerializer()).serializeToString(xmlDom);
} else if (typeof xmlDom.xml != 'undefined') {
xml = xmlDom.xml;
} else {
throw new Error('无法解析 XML!');
}
return xml;
}

 
PS:由于兼容性序列化过程有一定的差异,可能返回的结果字符串可能会有一些不同。至于 load()加载 XML 文件则因为只有部分浏览器支持而无法跨浏览器。

 

  • 大小: 48.5 KB
  • 大小: 25.7 KB
  • 大小: 26.9 KB
分享到:
评论

相关推荐

    很经典的XML入门教程

    第三章:XML 的语法 第四章:文档类型定义 DTD(Document Type Definition) 第五章:在NetScape 和IE 中的XML 第六章:微软的XML 解释器 第七章:XML DOM 第八章:XSL - The Style Sheet Language of XML(XML 的样式...

    XML初学入门教程(pdf)

    第一章:在学习XML之前你应该掌握什么 2 第二章:怎么使用XML 3 第三章:XML的语法 4 第四章:文档类型定义 DTD(Document Type Definition) 6 第五章:在NetScape和IE中的XML 8 第六章:微软的XML...

    ActionScript 3.0 开发人员指南 (AS3开发帮助文档)

    第 30 章 : 键盘输入 第 31 章 : 鼠标输入 第 32 章 : 触摸、多点触控和手势输入 第 33 章 : 复制和粘贴 第 34 章 : 加速计输入 第 35 章 : AIR 中的拖放 第 36 章 : 使用菜单 第 37 章 : AIR 中的任务栏图标...

    嵌入式WEB服务器及远程测控应用详解.rar

    第三章:XML技术及Java Script技术在网页中的使用 第四章:CGI介绍及表单提交方式 第五章:简单的 LED 测试 第六章:A/D测量及在网页中的显示 第七章: 基于 ZC301摄像头开源视频服务器代码移植 第八章: IP ...

    xml入门教程

    ••••••••••••••••••••••••3 第三章:XML的语法••••••••••••••••••••••••••••••••••••••••••••••••••••••••••4 第四章:...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    全书一共被压缩为5个rar,这是第三个!!!! 其他的请看ID:ljtt123(本人分享) 本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何...

    微软c#.net 课件 语言基础

    第三章:C# 中对象的创建 第四章:面向对象的编程技术 第五章:C# 编程 第六章:编写基于 .NET 的应用程序 第七章:使用 ADO.NET 访问数据 第八章:创建基于 Windows的应用程序 第九章:在 C# 应用程序中使用 XML ...

    微C#培训课件PPT下载

    第三章:C# 中对象的创建 第四章:面向对象的编程技术 第五章:C# 编程 第六章:编写基于 .NET 的应用程序 第七章:使用 ADO.NET 访问数 据 第八章:创建基于 Windows的应用程序 第九章:在 C# 应用程序中使用 ...

    优质课件 北京大学研究生课程文本挖掘 文本数据挖掘PPT教程(共57页)TextMining13-XML 半结构化挖掘.pptx

    第三章:文本检索技术(6学时) 第四章:文本自动分类技术(3学时) 第五章:文本自动聚类技术(3学时) 第六章:话题检测与追踪(3学时) 第七章:文本过滤技术(1.5学时) 第八章:关联分析技术(1.5学时) 第九章...

    C++_GUI_Programming_with_Qt_4_CH

    第三章.创建主窗体 第四章.实现程序功能 第五章.创建自定义空间 第二部分:中级QT 第六章.布局管理器 第七章.事件处理 第八章.2D和3D绘图 第九章.拖拽和扔放操作 第十章. “项浏览”类 第十一章.容器类 第十二章.输入...

    CCNA 中文读书笔记

    第三章:IP Subnetting and Variable Length Subnet Masks(VLSM) 第四章:Introduction to the Cisco IOS 第五章:IP路由 第六章:Enhanced IGRP(EIGRP) and Open Shortest Path First(OSPF) 第七章:Layer 2 ...

    用XML轻松开发WEB站点

    第三部分(XML的实践),内容包括:创建XML文档,创建属于自己的DTD,内容与形式的结合——XSL,XML DOM技术,同步多媒体合成语言SMIL,ASP与XML的联合开发; 第四部分(XML高阶),内容包括:XML在数据库中的...

    XML原理及应用(XML设计)

    本书在讨论XML基本原理和结构的基础上,...第三章 DTD 第四章 Schema 第五章 名域. 第六章 CSS 第七章 XSL. 第八章 XPath、XLink和XPointe 第九章 XML的DOM接口 第十章 SAX. 第十一章 数据库访问 附 录 应用程序实例

    xml实用大全和轻松学习手册和无废话xml

    · 第三章:XML的术语 · 导言 · 一.XML文档的有关术语 · 二.DTD的有关术语 · 第四章:XML的语法 · 一.XML语法规则 · 二.元素的语法 · 三.注释的语法 · 四.CDATA的语法 · 五.Namespaces的语法 · 六.entity的...

    Java语言基础下载

    第三十二章:配置Struts组件 654 学习目标 654 三个 XML文件和一个属性文件 655 Web应用部署描述符 web.xml 655 ActionServlet的参数的配置 656 应用资源文件 658 Ant构建文件 659 配置Tiles框架 660 内容总结 661 ...

    xml.rar_Recall_XML DOM_html_xml_xml dtd

    从第二章到第四章,我们分别从XML语法、DTD和样式单三方面详细介绍XML的三个基本要件。在第五、第六章中,我们从与XML相关的协议和软件工具两个角度来分析XML的使用现状。第七、八、九章,我们将讨论一些与XML相关的...

    Csharp入门经典(第四版).part5.rar

    目录: ...第30章 属性 第31章 XML文档说明 第32章 网络 第33章 GDI+简介 第34章 Windows Presentation Foundation 第35章 Windows Communication Foundation 第36章 Windows Workflow Foundation

    xml课件深入讲解 (从容学会xml)

    xml课件深入讲解: 1、第一至四章 简单熟悉xml 2、第五章 DTD 3、第六章 NS 4、第七章 SCHEMA 5、第八、九章 XSLT 6、第十章 DSO数据岛 7、第十一、十二章 DOM 8、第十三章 flash+xml 9、第十四章 asp+dom

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

     好了,通过第三章的学习,我们已经了解了一些XML和DTD的基本术语,但是我们还不知道怎样来写这些文件,需要遵循什么样的语法,在下一章,将重点介绍有关撰写XML和DTD文档的语法。 第四章 XML语法 七.DTD的语法...

    XML 高级编程,完整目录版,便于阅读

    第三章,XmlDocument 第四章,XPath 第五章,转换 第六章,ADO.NET 第七章,SQL Server 2000 和SqlXml 托管类 第八章,电子商务和XML 第九章,XQuery 第十章,性能问题 第十一章 Web服务案例分析:电子商务引擎设计

Global site tag (gtag.js) - Google Analytics