JavaScript操作XML是通过XML DOM来完成的 Ie 下面是用ActiveX对象来实现的。
那么什么是XML DOM呢?
XML DOM 是:
- 用于 XML 的标准对象模型
- 用于 XML 的标准编程接口
- 中立于平台和语言
- W3C 的标准
XML DOM 定义了所有XML 元素的对象和属性,以及访问它们的方法(接口)。
也就是说:
XML DOM 是用于查询、添加、修改、删除XML 元素的标准。
ie创建 xml
function xmlcreate() {
var version = [
'MSXML2.DOMDocument6.0',
'MSXML2.DOMDocument3.0',
'MSXML2.DOMDocument'
];
for(var i=0; i<version.length;i++) {
try {
var xml = new ActiveXObject(version[i]);
return xml;
}catch(e) {
}
}
throw new Error('您的系统不支持MSXML库');
}
//载入XML文件,两种方式:1.加载XML字符loadXML();2.加载XML外部文件load()
xml.loadXML('<root>\n<user>Lee</user>\n</root>'); //加载XML字符串
alert(xml.xml);
打印第一个内容 必须用标准DOM
alert(xml.getElementsByTagName('user')[0].firstChild.nodeValue);
加载外部xml
xml.load('a.xml');
动态添加xml
xml.load('a.xml');
var b = xml.createElement('bbb');
var root = xml.documentElement;
root.appendChild(b);
alert(xml.xml);
服务器端 同步/异步
在服务器端 默认用的异步加载 没加载完毕 就打印 肯定出不来
把这个值设为false 就能同步加载了
xml.async = false;
但是如果xml过大 会造成假死状态
不过异步比较好 但是异步又获取不到内容 这该怎么办呢
有个事件
xml.onreadystatechange = function
这个事件可以判断是否加载完成 不过要先载入事件 先把事件加载到内存中 然后再载入xml
事件里面有个属性 xml.readyState 可以判断是否加载完成
这个函数等xml全部加载好 开始处理
xml.onreadystatechange = function() {
if(xml.readyState ==4){ //如果正确就输出
if(xml.parseError == 0) {
alert(xml.xml);
}else { //如果错误 就返回
var a = "错误代码"+xml.parseError.errorCode+'\r\n';
a += "错误行号"+xml.parseError.line+'\r\n';
a += "错误上一行"+xml.parseError.linepos+'\r\n';
a += "错误信息"+xml.parseError.reason+'\r\n';
alert(a);
}
}
}
DOM2操作xml
//create xml 第一个参数 命名空间 第二个 根节点 第三个 文档声明
var xml = document.implementation.createDocument('','root',null); //创建xml
var user = xml.createElement('user');
xml.documentElement.appendChild(user); //插入user
alert(xml.getElementsByTagName('user')[0].tagName); //取得user
dom2也有load方法 默认也是异步的 可以通过设置同步来加载
获取一条信息
var xml = document.implementation.createDocument("",'root',null);
xml.async = false;
xml.load('a.xml');
alert(xml.getElementsByTagName('url')[0].firstChild.nodeValue);
也可以 通过 textContent 不过 ie不支持
alert(xml.getElementsByTagName('url')[0].textContent);
dom如果异步的话 怎么判断是否加载完成呢 可以通过load方法判断 比ie简单了很多
var xml = document.implementation.createDocument("",'root',null);
xml.onload = function(){
alert(xml.getElementsByTagName('url')[0].textContent);
}
xml.load('a.xml');
ps 不过 load 只支持 firefox 和最新版本的opera
但是 w3c提供了2个对象处理xml
var xml = new DOMParser(); //实例化xml对象
var a= "<root><user>gwyy</user></root>";
var xmldom = xml.parseFromString(a,'text/xml'); //通过xml对象创建xml
var seria = new XMLSerializer() //序列号xml
var z = seria.serializeToString(xmldom);
alert(z);
DOM2没有错误对象 出错了 会给你返回一段xml格式的错误信息
//判断错误
var errors = xmldom.getElementsByTagName('parsererror');
if(errors.length > 0) {
throw new Error('错误信息:'+errors[0].textContent);
}
下面是跨浏览器创建xml
//跨浏览器创建
function createxml(xmlstr) {
var xml = null;
if(typeof window.DOMParser != "undefined") {
xml = (new DOMParser).parseFromString(xmlstr,'text/xml');
var errors = xml.getElementsByTagName('parsererror');
if(errors.length > 0){
throw new Error('错误信息:'+errors);
}
} else if(typeof window.ActiveXObject != "undefined") {
var version = [
'MSXML2.DOMDocument6.0',
'MSXML2.DOMDocument3.0',
'MSXML2.DOMDocument'
];
for(var i=0;i<version.length;i++) {
try{
xml = new ActiveXObject(version[i]);
return xml;
}catch(e){
}
}
xml.loadXML(xmlstr);
if(xml.parseError != 0) {
throw new Error('错误信息'+xml.parseError.reason);
}
return xml;
} else {
throw new Error('你的系统或浏览器不支持xml');
}
return xml;
}
//序列化
function serializerXMl(xmlstr) {
var xml = "";
if(typeof window.XMLSerializer != "undefined") {
xml = (new XMLSerializer()).serializeToString(xmlstr);
} else if(typeof xmlstr.xml != "undefined"){
xml = xmlstr.xml;
}
return xml;
}
//实现
var xmlstr = "<root><user>aaaa</user></root>";
var xmldom = createxml(xmlstr);
alert(serializerXMl(xmldom));
为了跨浏览器 xml 只能放弃从外部加载xml