java学习

java学习

 

js操作xml

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

posted on 2012-12-29 15:44 杨军威 阅读(267) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜