XML 是指可扩展标记语言。 被设计用来 传输 和 存储数据。(可以理解为微型的数据库)非常好学。
曾几何时,XML一度成为存储和传输结构化数据的标准。DOM 出现以后,所有浏览器都内置了对 XML 的原生支持(XML DOM),同时也提供了一系列相关的技术支持。
简介
先看一下XML长什么样子吧:
javascript
cwyaml
0.0
可以看出它和 html 长得很像,但是它一般没有属性和样式,仅仅是用有意义的标签来包裹数据,而 html 则需要那些东西让浏览器来渲染页面。上面的 XML 文件就存储了一本书的名称、作者和价格等信息。等我们需要这些数据的时候,用 js 来提取就行了。
PS: XML 和 html 一样,可以使用 标准DOM 来操作。
语法规则
1、所有元素标签由用户自己定义,元素本身没有实际意义。html 中的标签都是规定的,自创的标签浏览器不会解析。
2、所有 XML 元素都必须有关闭标签。(声明没有关闭标签,这不是错误,声明不是 XML 文档本身的一部分)。html中可以有单标签,比如:
、
等。
3、对大小写敏感。标签
4、XML 文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。一般情况下最外层的标签用
。这个是约定俗成的,你也可以用其他任何标签,不必纠结!!
5、与 HTML 类似,XML 元素也可拥有属性(名称/值的对)。属性值必须用双引号包裹
6、在 XML 中,空格会被保留。 html 中的连续空格在解析是会被合并为一个。
使用方法
XML 的使用方法分为 IE中的XML(IE9-) 和 其他浏览器中的XML(支持DOM2、DOM3的浏览器,包括IE9+)
DOM2中的XML
主要有两个方法:
1、DOMParser() 创建xmlDom对象,然后使用 parseFromString() 方法来解析 xml 元素
var parser = DOMParser(); //创建xmlDom对象
var xmlDom = parser.parseFromString(' ','text/xml');
alert(xmlDom.docuemntElement.tagName); //root
PS:DOMParser 只能解析格式良好的 XML,再发生错误时会从 parseFromString() 中返回一个 Document 对象,包含一个文档元素
所以在解析之后我们可以通过判断
2、 XMLSerializer() 创建 XML 实例,然后使用 serializeToString() 方法将DOM文档序列化为XML
var serializer = new XMLSerializer();
var xml = serialize.serializeToString(xmlDom);
alert(xml);
IE中的XML
IE浏览器是最早支持 XML 的,早期 IE 中的 XML 是通过 ActiveX 对象实现的,直到现在这个对象也只有IE有,但只在 IE9 及之前的版本中使用。微软当年为了开发人员方便的处理 XML,创建了 MSXML 库,但却没有染 Web 开发人员通过浏览器访问相同的对象。(也就是说,这个MSXML库是存在你的 window 系统当中的,而不是浏览器自带的,能不能使用还和你的系统有关)
1、创建xmlDom对象
要解析XML字符串,必须先创建一个xmlDom对象。
var xmlDom = new ActiveXObject('MSXML2.DOMDocument');
说明: MSXML库有6个版本,不过只需要了解以下三种就可以了。(微软自己说的,不推荐使用另外那三种)
- MSXML2.DOMDocument.6.0 最可靠最新版本
- MSXML2.DOMDocument.3.0 兼容性较好的版本
- MSXML2.DOMDocument 针对IE5.5之前的版本使用
因为不同版本的MSXML库对不同浏览器的支持不相同,所以我们应该用兼容的方式来创建xmlDom对象:
function createXMLDOM(){
var version = [
'MSXML2.DOMDocument.6.0',
'MSXML2.DOMDocument.3.0',
'MSXML.2.DOMDocument'
];
for(var i = 0;i < version.length;i++){
try{
var xmlDom = new ActiveObject(version[i]);
return xmlDom;
}
catch(ex){
//这里跳过 如果这里写代码的话,当不支持6.0的话就会报错而不往下循环for语句
}
}
throw new Error('您的浏览器或浏览器不支持MSXML库!');
//三个版本都不支持是才抛出错误
}
2、 加载XML
加载XML分为两种:加载xml字符串、加载xml外部文件
- 加载xml字符串 使用 loadXML() 方法
var xmlDom = createXMLDOM();
xmlDom.loadXML('cwyaml ');
//直接把xml字符串写在里面就可以了
- 加载xml外部文件 使用 load() 方法
var xmlDom = createXMLDOM();
xmlDom.load('demo.xml');
//假如有一个 demo.xml 外部文件
3、 错误处理
如果解析过程出错,可以在 parseError
属性中找到错误信息。这个属性本身包含一个包含多个属性的对象,每个对象都保存着有关解析错误的某一方面信息。
取得有关错误信息很简单:
if(xmlDom.parseError != 0){
alert('一个错误:\n
Error Code:' + xmlDom.parseError.errorCode + '\n'
+ 'line:' + xmlDom.parseError.line + '\n'
+ 'line Pos:' + xmlDom.parseError.linepos + '\n'
+ 'Reason:' + xmlDom.parseError.reason);
}
在载入XML文档之后,操作之前检查是否发生错误!!
同步和异步
load()方法用于服务器端载入XML时,存在两种加载方式:同步和异步。
所谓同步:就是在加载XML完成之前,代码不会继续执行,完全加载后再返回。简单方便,但容易造成浏览器假死。
所谓异步:加载XML时是浏览器后台处理,不会影响其他代码的执行。默认使用异步,也推荐使用异步加载。
xmlDom.async = fasle; //设置同步,不设置就是异步
在异步加载 XML 文件的情况下,需要为 XMLDOM 文档的 onreadystatechange 事件指定处理程序。通过 **readyState **属性可以获得就绪状态,一共有四种,只需关注就绪状态:4。
var xmlDom = createDocument();
xmlDom.async = true; //不设置也可以
xmlDom.onreadystatechange = function(){
if(xmlDom.readyState == 4){ //判断是否就绪
if(xmlDom.parsererror != 0){
//错误处理!
}else{
//执行DOM操作
}
}
}
PS:为 onreadystatechange 事件指定处理程序语句必须放在调用 load() 方法之前,这样才能确保就绪状态变化时调用这段事件处理程序
跨浏览器处理XML
1、 跨浏览器创建 xmlDom 对象
首相声明 IE 中的 load() 方法在 DOM2 中没有与之对应的功能,所以不能做兼容
//跨浏览器创建xmlDom对象
function parseXML(xml){
var xmlDom = null;
if(typeof DOMParser != 'undefined'){
xmlDom = (new DOMParser()).parseFromString(xml,'text/xml');
var errors = xmlDom.getElementsByTagName('parsererror');
if(errors.length){
throw new Error('XML parsing error:' + errors[0].textContent);
}
}else if(typeof ActiveXObject != 'undefined'){
xmlDom = createXMLDOM();
xmlDom.loadXML(xml);
if(xmlDom.parsererror != 0){
throw new Error('XML parsing error:' + xmlDom.parseError.reason);
}
}else {
throw new Error('No XML parser available.');
}
return xmlDom;
}
2、跨浏览器序列化 XMLDom
//跨浏览器序列化xmlDOM
function serializeXML(xmlDom){
if(typeof XMLSerializer != 'undefined'){
return (new XMLSerializer()).serializeToString(xmlDom);
}else if(typeof xmlDom.xml != 'undefined'){
return xmlDom.xml;
}else {
throw new Error('不支持序列化xmlDom对象!');
}
}