XML语法

XML 是指可扩展标记语言。 被设计用来 传输存储数据。(可以理解为微型的数据库)非常好学。

曾几何时,XML一度成为存储和传输结构化数据的标准。DOM 出现以后,所有浏览器都内置了对 XML 的原生支持(XML DOM),同时也提供了一系列相关的技术支持。

简介

先看一下XML长什么样子吧:

    

  javascript
  cwyaml
  0.0

可以看出它和 html 长得很像,但是它一般没有属性和样式,仅仅是用有意义的标签来包裹数据,而 html 则需要那些东西让浏览器来渲染页面。上面的 XML 文件就存储了一本书的名称、作者和价格等信息。等我们需要这些数据的时候,用 js 来提取就行了。

PS: XML 和 html 一样,可以使用 标准DOM 来操作。

语法规则

1、所有元素标签由用户自己定义,元素本身没有实际意义。html 中的标签都是规定的,自创的标签浏览器不会解析。

2、所有 XML 元素都必须有关闭标签。(声明没有关闭标签,这不是错误,声明不是 XML 文档本身的一部分)。html中可以有单标签,比如:


等。

3、对大小写敏感。标签 与标签 是不同的。

4、XML 文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。一般情况下最外层的标签用 。这个是约定俗成的,你也可以用其他任何标签,不必纠结!!

5、与 HTML 类似,XML 元素也可拥有属性(名称/值的对)。属性值必须用双引号包裹

6、在 XML 中,空格会被保留。 html 中的连续空格在解析是会被合并为一个。

使用方法

XML 的使用方法分为 IE中的XML(IE9-) 和 其他浏览器中的XML(支持DOM2、DOM3的浏览器,包括IE9+)

DOM2中的XML

主要有两个方法:
1、DOMParser() 创建xmlDom对象,然后使用 parseFromString() 方法来解析 xml 元素

var parser = DOMParser();   //创建xmlDom对象
var xmlDom = parser.parseFromString('','text/xml');   
alert(xmlDom.docuemntElement.tagName);  //root

PS:DOMParser 只能解析格式良好的 XML,再发生错误时会从 parseFromString() 中返回一个 Document 对象,包含一个文档元素 ,内容为对解析错误的描述。

所以在解析之后我们可以通过判断 是否存在来判断是否解析错误!

2、 XMLSerializer() 创建 XML 实例,然后使用 serializeToString() 方法将DOM文档序列化为XML

var serializer = new XMLSerializer();
var xml = serialize.serializeToString(xmlDom);
alert(xml);

IE中的XML

IE浏览器是最早支持 XML 的,早期 IE 中的 XML 是通过 ActiveX 对象实现的,直到现在这个对象也只有IE有,但只在 IE9 及之前的版本中使用。微软当年为了开发人员方便的处理 XML,创建了 MSXML 库,但却没有染 Web 开发人员通过浏览器访问相同的对象。(也就是说,这个MSXML库是存在你的 window 系统当中的,而不是浏览器自带的,能不能使用还和你的系统有关)

1、创建xmlDom对象
要解析XML字符串,必须先创建一个xmlDom对象。

var xmlDom = new ActiveXObject('MSXML2.DOMDocument');

说明: MSXML库有6个版本,不过只需要了解以下三种就可以了。(微软自己说的,不推荐使用另外那三种)

  • MSXML2.DOMDocument.6.0 最可靠最新版本
  • MSXML2.DOMDocument.3.0 兼容性较好的版本
  • MSXML2.DOMDocument 针对IE5.5之前的版本使用

因为不同版本的MSXML库对不同浏览器的支持不相同,所以我们应该用兼容的方式来创建xmlDom对象:

function createXMLDOM(){
    var version = [
        'MSXML2.DOMDocument.6.0',
        'MSXML2.DOMDocument.3.0',
        'MSXML.2.DOMDocument'
    ];
    for(var i = 0;i < version.length;i++){
        try{
            var xmlDom = new ActiveObject(version[i]);
            return xmlDom;
        }
        catch(ex){
            //这里跳过 如果这里写代码的话,当不支持6.0的话就会报错而不往下循环for语句
        }
    }
    throw new Error('您的浏览器或浏览器不支持MSXML库!');
    //三个版本都不支持是才抛出错误
}

2、 加载XML
加载XML分为两种:加载xml字符串、加载xml外部文件

  • 加载xml字符串 使用 loadXML() 方法
var xmlDom = createXMLDOM();
xmlDom.loadXML('cwyaml'); 
//直接把xml字符串写在里面就可以了
  • 加载xml外部文件 使用 load() 方法
var xmlDom = createXMLDOM();
xmlDom.load('demo.xml');
//假如有一个 demo.xml 外部文件

3、 错误处理
如果解析过程出错,可以在 parseError 属性中找到错误信息。这个属性本身包含一个包含多个属性的对象,每个对象都保存着有关解析错误的某一方面信息。

取得有关错误信息很简单:

if(xmlDom.parseError != 0){
  alert('一个错误:\n 
    Error Code:' + xmlDom.parseError.errorCode + '\n'
    + 'line:' + xmlDom.parseError.line + '\n'
    + 'line Pos:' + xmlDom.parseError.linepos + '\n'
    + 'Reason:' + xmlDom.parseError.reason);
}

在载入XML文档之后,操作之前检查是否发生错误!!

同步和异步

load()方法用于服务器端载入XML时,存在两种加载方式:同步和异步。

所谓同步:就是在加载XML完成之前,代码不会继续执行,完全加载后再返回。简单方便,但容易造成浏览器假死。

所谓异步:加载XML时是浏览器后台处理,不会影响其他代码的执行。默认使用异步,也推荐使用异步加载。

xmlDom.async = fasle;   //设置同步,不设置就是异步

在异步加载 XML 文件的情况下,需要为 XMLDOM 文档的 onreadystatechange 事件指定处理程序。通过 **readyState **属性可以获得就绪状态,一共有四种,只需关注就绪状态:4。

var xmlDom = createDocument();
xmlDom.async = true;        //不设置也可以

xmlDom.onreadystatechange = function(){
    if(xmlDom.readyState == 4){     //判断是否就绪
        if(xmlDom.parsererror != 0){
        //错误处理!
        }else{
        //执行DOM操作
        }
    }
}

PS:为 onreadystatechange 事件指定处理程序语句必须放在调用 load() 方法之前,这样才能确保就绪状态变化时调用这段事件处理程序

跨浏览器处理XML

1、 跨浏览器创建 xmlDom 对象
首相声明 IE 中的 load() 方法在 DOM2 中没有与之对应的功能,所以不能做兼容

//跨浏览器创建xmlDom对象
function parseXML(xml){
    var xmlDom = null;

    if(typeof DOMParser != 'undefined'){
        xmlDom = (new DOMParser()).parseFromString(xml,'text/xml');
        var errors = xmlDom.getElementsByTagName('parsererror');
        if(errors.length){
            throw new Error('XML parsing error:' + errors[0].textContent);
        }
    }else if(typeof ActiveXObject != 'undefined'){
        xmlDom = createXMLDOM();
        xmlDom.loadXML(xml);
        if(xmlDom.parsererror != 0){
            throw new Error('XML parsing error:' + xmlDom.parseError.reason);
        }
    }else {
        throw new Error('No XML parser available.');
    }

    return xmlDom;
}

2、跨浏览器序列化 XMLDom

//跨浏览器序列化xmlDOM
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('不支持序列化xmlDom对象!');
    }
}

你可能感兴趣的:(XML语法)