XML:Extensible Markup Language(可扩展标记语言)
是SGML(标准通用标记语言)的子集,是w3c的推荐标准。
用途:xml可以对文档和数据进行结构化处理,他被设计用来存储和传输结构化数据。
XML一度成为存储和通过因特网传输结构化数据的标准。
特点:
xml是一种很像html的标记语言。
设计的宗旨是用来传输数据而不是显示数据。
他的标签没有被预定义,需要自定义标签。
他被设计为具有自我描述性
是W3C的推荐标准。
IE8及之前版本的XML
IE是第一个支持xml的浏览器,IE9及以后的浏览器都已经支持DOM2级规范,对于IE8及之前版本对XML的支持是通过activeX对象实现的。微软创建了MSXML库,这是系统自带的,并没有针对JS创建对象,所以对于IE8及之前版本的浏览器只有在微软系统下,才能正常的使用xml。创建XML文档实例
方法:需要使用ActiveXobject构造函数,并为其传入一个表示XML文档版本的字符串。
function createXmlDocument(){
outermost:
if(typeof arguments.callee.activeXString!="string"){
var versions=["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument"];
for(var i=0;i<versions.length;i++){
try {
new ActiveXObject(versions[i]);
arguments.callee.activeXString=versions[i];
break outermost;
}catch(e){
//跳过
}
}
throw new Error("您的系统或浏览器不支持MSXML库");
}
return new ActiveXObject(arguments.callee.activeXString);
}
var xmldom=createXmlDocument();
alert(xmldom);
特点:
1、arguments.callee.activeXString
这句代码运用了函数的内部属性对象arguments以及调用他的属性callee返回函数createXmlDocument,并为该函数设置了一个自定义的属性,用来存放该浏览器所支持的MSXML库版本信息。
2、使用if语句的原因,是想如果使用函数创建了一次xml对象,获得版本信息后,下次就可以直接使用不用再次循环判断。
3、错误捕获:当new ActiveXObject(versions[i]);
发生错误时,或跳过该版本至下一个版本,如果成功,直接返回new ActiveXObject(arguments.callee.activeXString)
,如果均不成功,那么抛出错误信息。
4、使用label与break结合,因为单独使用break只会跳到for外面,那么无论版本存不存在,都会抛出错误。加上标签,使得直接跳转至if语句外。-
载入xml
- 加载xml字符loadXML()
var xmldom=createXmlDocument();
xmldom.loadXML("<root><user>Lee</user></root>");//加载字符串
//alert(xmldom.xml);//序列化xml
var anotheruser=xmldom.createElement("user");
var usertxt=xmldom.createTextNode('duu');
anotheruser.appendChild(usertxt);
xmldom.documentElement.appendChild(anotheruser);
【发现】原先document.××××的地方都被新建的xml对象替换了。这个对象的每一个dom节点都有一个xml属性,用来表示该节点的xml字符串。 - 加载XML外部文件load()
- 加载xml字符loadXML()
要加载的文档必须是与页面中运行的js脚本文件来自于同一台服务器。
在服务器端加载文档的方式分为同步与异步。
简单理解:
同步:必须要等待文档加载完毕才可以执行后续代码。(缺点:造成阻塞,假死等现象)
异步:文档与后续代码可以分别执行。(缺点:造成后续代码执行时,获取不到文档的内容)
但是,我们在加载文档的时候通常都试用异步的方式,在异步加载文档时,需要为xmldom文档的`onreadystatechange`事件制定处理程序。
var xmldom=createXmlDocument();
xmldom.async=true;
xmldom.onreadystatechange=function(){
if(xmldom.readyState==4){
alert(xmldom.xml);
}
}
xmldom.load("demo.xml");
特点:
1、async
xml对象的这个属性,可以设置加载文档的方式是同步还是异步,默认值为true,表示异步,false表示同步。
2、事件处理程序要写在.load
之前,这样当事件发生时,可以触发。
3、xmldom.readyState
该属性一共有4个就绪状态,为4时,表示已经完全可以使用加载的文档。
4、事件处理程序内不可以使用this,因为this指向的是window对象。
-
错误解析
如果解析过程中出错,可以去xml文档对象的parseError
属性中找到错误信息。
进行测试将demo.xml的标记做一个改动。
var xmldom=createXmlDocument();
xmldom.async=true;
xmldom.onreadystatechange=function(){
if(xmldom.readyState==4){
if(xmldom.parseError!=0){
alert("错误信息:\n错误行号:"+xmldom.parseError.line+
"\n错误代码:"+xmldom.parseError.errorCode+
"\n所在文件:"+xmldom.parseError.url+
"\n错误原因:"+xmldom.parseError.reason)
}
else{
alert(xmldom.xml);
}} } xmldom.load("demo.xml");
我在上面的载入文件的基础上,添加了对错误解释的判断。
特点:xmldom.parseError
的默认值为errorCode。当没有发生错误使,该值为0,一旦发生错误,该值要么是正数要么是负数。