浏览器对XML DOM的原生支持

XML(可扩展标记语言)被设计用来传输和存储数据;
HTML(超文本标记语言) 被设计用来显示数据。

DOM2级是首先提出 动态创建XML DOM概念的规范。

【创建XML文档】
document.implementation.createDocument("","root",null); 
第一个参数为命名空间,第二个参数为XML文档元素的标签名,第三个参数是文档类型。
document.implementation返回处理该文档的 DOMImplementation 对象,
DomImplementation 对象可执行与文档对象模型的任何实例无关的任何操作。

DomImplementation


【解析XML文档成DOM结构】
1. 创建DOMParser实例
2. 调用parseFromString(XML字符串,"text/xml")方法,该方法返回一个Document对象
var parser = new DOMParser();
var xmldom = parser.parseFromString("<root><child/></root>","text/xml");

当发生解析错误时,parseFromString方法会返回一个<parsererror>元素,元素内容是对错误的描述。


【将DOM文档序列化为XML字符串】
1. 创建XMLSerializer实例
2. 调用serializeToString(xmldom)
var serializer = new XMLSerializer();
var xml = serializer.serializeToString(xmldom);

【IE8及更早版本的XML】通过ActiveX对象实现

1.【创建XML文档】
通过创建ActiveXObject类型来创建XML文档实例 : new ActiveXObject()

function createDocument(){
        if(typeof arguments.callee.activeXString != "string"){
        //XML文档版本
            var version = ["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument"],
                i,
                len;
            for(i=0,len=version.length;i<len;i++){
                try{
                    new ActiveXObject(version[i]);
                    arguments.callee.activeXString = version[i]; 
                    //如果版本有效,将可用版本直接保存在activeXString属性中。
                    break;
                }catch(ex){
                    continue;
                }
            }
            return new ActiveXObject(arguments.callee.activeXString);
        }
    }

2.【解析XML字符串】

(1)创建DOM文档
(2)调用loadXML(xml字符串)方法
var xmldom = createDocument();
xmldom.loadXML("<root><child/></root>");

当发生解析错误时,可以在parseError属性中找到错误信息。

parseError属性包含一系列属性:
这里写图片描述
另外,parseError的valueof()方法返回errorCode的值。

3.【序列化XML】
IE将序列化XML的能力内置在DOM文档中,为每个DOM节点提供了xml属性,保存着节点的XML字符串。

xmldom.xml;

4.【加载XML】
加载文档的方式有”同步”和”异步”两种,通过async属性设置,true为异步;false为同步
确定完加载方式后,调用load()可以启动下载过程。(注意:不是loadXML())
在异步加载XML文件的情况下,还需要在调用load()之前给onreadystatechange事件指定事件处理程序。

var xmldom = createDocument();
xmldom.async = true; //异步加载

xmldom.onreadystatechange = function(){
    //当XML文件全部加载完并且解析为DOM文档时,就绪状态readyState为4
    if(xmldom.readyState == 4){
        if(xmldom.parseError.valueOf() !=0){
            console.log("发生解析错误:\n错误类型数值编码:"+xmldom.parseError.errorCode+
                "\n发生错误的行:"+xmldom.parseError.line+"\n发生错误的行中字符"+xmldom.parseError.linepos+
                "\n发生错误的脚本解释:"+xmldom.parseError.reason);
        }
        else{
            //处理xml文档
        }
    }
};
xmldom.load("xml文件");

【跨浏览器解析XML】
function parseXml(xml){
    if(typeof DOMParser != "undefined"){
        var xmldom = (new DOMParser()).parseFromString(xml,"text/xml");
        var errors = xmldom.getElementsByTagName("parsererror");
        if(errors.length){
            throw new Error("XML解析错误:"+errors[0].textContent);
        }
    }else if(typeof ActiveXObject != "undefined"){
        var xmldom = createDocument();
        xmldom.load(xml);
        if(xmldom.parseError.valueOf() !=0){
            throw new Error("XML解析错误:"+xmldom.parseError.reason);
        }
    }else{
        throw new Error("无法解析XML");
    }
}

在使用该parseXML函数解析XML时,应该把XML放在try-catch语句中,以防发生错误。

var xmldom = null;
try{
    xmldom = parseXml("<root><child/></root>");
    //进一步处理
}catch(ex){
    console.log(ex.message);
}

【跨浏览器序列化XML】
function serializeXML(xmldom){
        if(typeof XMLSerializer != "undefined"){
            return (new XMLSerializer()).serializeToString(xmldom);
        }else if(typeof xmldom.xml != 'undefined'){
            return xmldom.xml;
        }else{
            throw new Error("无法序列化为XML");
        }
    }
var xml = serializeXML(xmldom); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值