XML、XMLDOM、XMLHttpRequest 详解(一)

var xmlDom = new ActiveXObject(‘MSXML2.DOMDocument’);

下面有一份 ActiveXObject 类型表:

| XML版本字符串 | 说明 |

| — | — |

| Microsoft.XmlDom | 最初随同IE发布,不建议使用 |

| MSXML2.DOMDocument | 脚本处理而更新的版本,仅在特殊情况作为备份用 |

| MSXML2.DOMDocument.3.0 | 在JavaScript中使用,这是最低的建议版本 |

| MSXML2.DOMDocument.4.0 | 脚本处理时并不可靠,使用这个版本导致安全警告 |

| MSXML2.DOMDocument.5.0 | 脚本处理时并不可靠,使用这个版本导致安全警告 |

| MSXML2.DOMDocument.6.0 | 脚本能够可靠处理的最新版本 |

ps:在这六个版本中微软只推荐三种:

1、MSXML2.DOMDocument.6.0 【最可靠最新的版本】

2、MSXML2.DOMDocument.3.0 【兼容性较好的版本】

3、MSXML2.DOMDocument 【仅针对IE5.5之前的版本】

考虑到这三个版本在不同的 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!’); // 循环后抛出错误

}

OK,我们现在通过这个方法就可以拿到一个 xmlDom 对象了。

var xmlDom = createXMLDOM();

// 载入 XML 文件

// 1、加载XML字符串loadXML()

xmlDom.loadXML(‘Yu’);

alert(xmlDom.xml);

// 2、加载XML外部文件load()

xmlDom.load(‘text.xml’);

console.log(xmlDom.xml)

XML 和 XHTML 一样,都是通过 DOM 节点操作的。

var user = xmlDom.getElementsByTagName(‘user’)[0]

console.log(user.nodeType)

console.log(user.tagName)

console.log(user.firstChild.nodeValue)

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

var email = xmlDom.createElement(email)

xmlDom.documentElement.appendChild(email)

// 为创建的节点添加内容

var emailText = xmlDom.createTextNode(‘react.dong.yu@gmail.com’)

email.appendChild(emailText)

同步及异步

=====

load() 方法是用于从服务器端载入 XML 的,并且限制在同一台服务器上的 XML 文件。那么在载入的时候有两种模式:同步和异步。

  • 同步:就是在加载 XML 完成之前,代码不会继续执行,直到完全加载了 XML 再返回。好处就是简单、方便,坏处就是如果加载的数据停止响应或延迟太久,浏览器会一直堵塞从而造成假死状态。

xmlDom.async = false //设置同步,false

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

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

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

XML DOM 中 readystatechange 事件

| 就绪状态 | 说明 |

| — | — |

| 1 | DOM正在加载 |

| 2 | DOM已经加载完数据 |

| 3 | DOM已经可以使用,但某些部分还无法访问 |

| 4 | DOM已经完全可以使用 |

var xmlDom = createXMLDOM()

xmlDom.async = true

xmlDom.onreadystatechange = function() {

if(xmlDom.readyState === 4) {

alert(xmlDom.xml)

}

}

xmlDom.load(‘test.xml’) // 放在后面重点体现异步的作用

1、可以通过 readyState 来了解事件的执行次数,将 load() 方法放到最后不会因为代码的顺序而导致没有加载。并且 load() 方法必须放在 onreadystatechange 之后,才能保证就绪状态变化时调用该事件处理程序,因为要先触发。

2、不能够使用this,不能够使用 IE 的事件处理函数,原因是 ActiveX 控件为了预防安全性问题

DOM2 中的 XML

===========

IE可以实现了对XML字符串或XML文件的读取,其他浏览器也各自实现了对XML处理功能。DOM2级在 document.implementaion 中引入了 createDocument() 方法。其他浏览器都支持。

1、创建XMLDOM对象

var xmlDom = document.implementation.createDocument(‘’,‘root’,null); // 创建

var user = xmlDom.createElement(‘user’); // 创建user元素

xmlDom.getElementsByTagName(‘root’)[0].appendChild(user); // 添加到root下

var value = xmlDom.createTextNode(‘Yu’); // 创建文本

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);

1、DOM2中不支持 loadXML() 方法,所以,无法简易的直接创建 XML 字符串,所以,只能采用以上的做法。

2、createDocument() 方法需要传递三个参数,命名空间,根标签名和文档声明,由于 JavaScript 管理命名空间比较困难,所以留空即可。文档声明一般根本用不到,直接null即可。命名空间和文档声明留空,表示创建XMLDOM对象不需要命名空间和文档声明。

2、DOMParser 类型

由于 DOM2 没有 loadXML() 方法直接解析 XML 字符串,所以提供了 DOMParser 类型来创建 XML DOM 对象。IE9、Safari、Chrome 和 Opera 都支持这个类型。

var xmlParser = new DOMParser(); // 创建DOMParser对象

var xmlStr = ‘Yu’; // 创建DOMParser对象

var xmlDom = xmlParser.parseFromString(xmlStr, ‘text/xml’); // 创建XML DOM对象

alert(xmlDom.getElementsByTagName(‘user’)[0].tagName)

XML DOM 对象是通过DOMParser对象中的parseFromString方法来创建的,两个参数:XML字符串和内容类型text/xml。

3、XML Serializer 类型

由于DOM2没有序列化XML的属性,所以提供了XMLSerializer类型来帮助序列化XML字符串。IE9、Safari、Chrome和Opera都支持这个类型。

var serializer = new XMLSerializer(); // 创建XMLSerializer对象

var xml = serializer.serializeToString(xmlDom); // 序列化XML

alert(xml);

4、解析错误

在 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来代替。

5、跨浏览器处理XML

如果要实现跨浏览器就要思考几个问题:

1、load()只有IE、Firefox、Opera支持,所以无法跨浏览器;

2、获取XMLDOM对象顺序问题,先判断先进的DOM3,然后再去判断落后的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;

}

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

XPath

=====

XPath 是一种节点查找手段,对比之前使用标准DOM去查找XML中的节点方式,大大降低了查找难度,方便开发者使用。但是,DOM3级以前的标准并没有就XPath做出规范;直到DOM3才首次推荐到标准规范行列。大部分浏览器实现了这个标准,IE则以自己的方式实现了XPath。

IE中的 XPath


selectSingleNode() // 获取单一节点

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-3zPuawpC-1715031406144)]

[外链图片转存中…(img-S9A3GY5V-1715031406144)]

[外链图片转存中…(img-2HGrXui8-1715031406144)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值