首页 > js学习 > js基础知识 > DOM2中的XML处理
2016
12-16

DOM2中的XML处理

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

一、创建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('user')[0].firstChild.nodeValue);

由于DOM2中不支持loadXML()方法,所以,无法简易的直接创建XML字符串。所以,只能采用DOM节点的创建和添加实现。

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

二、载入XML:只有Mozilla的Firefox才能支持,只不过新版的Opera也是支持的,其他浏览器则不支持。

DOM2只支持load()方法,载入一个同一台服务器的外部XML文件。另外,DOM2也有async属性,来表面同步或异步,默认异步。

同步情况下

xmlDom.async = false;

xmlDom.load('test.xml');

alert(xmlDom.getElementsByTagName('user')[0].tagName);

异步情况下

xmlDom.async = true;

addEvent(xmlDom, 'load', function () { //异步也可以直接用onload事件

alert(this.getElementsByTagName('user')[0].tagName);

});

xmlDom.load('test.xml');

三、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元素标签名

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

四、XMLSerializer类型

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

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

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

alert(xml);

五、解析错误

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

var errors = xmlDom.getElementsByTagName('parsererror');

if (errors.length > 0) {

throw new Error('XML格式有误:' + errors[0].textContent);

}

errors[0].firstChild.nodeValue也使用了errors[0].textContent来代替。

最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。