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