zoukankan      html  css  js  c++  java
  • JS:XML

    一 IE中的XML

      //1.创建XMLDOM对象
     1 //创建XMLDOM对象
     2     var xmlDom = new ActiveXObject("MSXML2.DOMDocument.6.0");  //IE9之前使用
     3     function createXMLDOM () {
     4         var version = [
     5             'MSXML2.DOMDocument.6.0',
     6             'MSXML2.DOMDocument.3.0',
     7             'MSXML2.DOMDocument'
     8 
     9         ];
    10 
    11         for(var i = 0; i<version.length;i++){
    12             try{
    13                 var xmlDom = new ActiveXObject(version[i]);  //IE中的
    14                 return xmlDom;
    15             }catch(e){
    16                 //跳过
    17             }
    18         }
    19         throw new Error("您的系统或浏览器不支持MSXML!");
    20     }

      

     //2.载入XML
        //若已经取得了XMLDOM对象,可以使用loadXML()和load()这两个方法可以分别载入XML字符串或XML文件。

     1 var xmlDom = createXMLDOM();
     2     xmlDom.loadXML("<root>
    <user>cc</user>
    </root>");  //loadXML()加载内部文件 
     3     alert(xmlDom.xml);  //.xml属性可以序列化XML,获取整个XML字符串。
     4     var user = xmlDom.getElementsByTagName("user")[0];
     5     alert(user.tagName);
     6     alert(user.innerHTML);  //innerHTML不是标准DOM
     7     alert(user.firstChild.nodeValue);
     8 
     9     var xmlDom02 = createXMLDOM(); 
    10     xmlDom02.load("xml01.xml");  //load()加载外部文件
    11     var bbb = xmlDom02.createElement("bbb");
    12     var root = xmlDom02.documentElement;
    13     var bbbText = xmlDom02.createTextNode("kkk");
    14     bbb.appendChild(bbbText); 
    15     root.appendChild(bbb);
    16     alert(xmlDom02.xml);


      //3.服务器端加载xml文件

        //使用同步加载文件

        

    1 xmlDom.async = false; 
    2 xmlDom.load("xml01.xml");
    3             //同步加载, 同步设置false,异步设置true,默认是异步
    4 alert(xmlDom.xml);

        //使用异步加载文件

    1 xmlDom.async = true;  //异步加载
    2 xmlDom.load("xml01.xml");
    3 alert(xmlDom.xml);

    同步加载与异步加载的区别:
    同步加载:在加载XML完成之前,代码不会继续执行,直到完全加载了XML再返回,好处就是简单方便,坏处就是如果加载的数据停止响应或延迟太久,浏览器会一直堵塞从而造成假死状态。

    异步加载:在加载XML时,JavaScript会把任务丢给浏览器内部后台去处理,不会造成堵塞,需要配合readystatechange事件使用
    通常使用异步方式 xmlDom.async = true.

     1                 xmlDom.onreadystatechange = function(){
     2                     if (xmlDom.readyState == 4) {  //完全加载了,再去获取XML
     3                         // alert(xmlDom.xml);  //这里的xmlDom不能是this,xmlDom是Object,此时的this是Windown。也不能够用IE的事件处理函数,因为ActiveX控件为了预防安全性问题。
     4 
     5                         //错误解析
     6                             if (xmlDom.parseError == 0) {
     7                                 alert(xmlDom.xml);
     8                             }else{
     9                                 throw new Error(
    10                                      "错误行号:" + xmlDom.parseError.line + 
    11                                     "
     错误代号:" + xmlDom.parseError.errorCode + 
    12                                     "
     错误解析:" + xmlDom.parseError.reason);        
    13                             }
    14 
    15 
    16                     };
    17                 }
    18                 xmlDom.load("xml01.xml");

      ps:虽然可以通过XML DOM文档加载XML文件,但公认的还是XMLHttpRequest对象比较好。

      解析错误

    二 DOM2中的XML

      DOM2的XML DOM对象是不支持loadXML()方法,无法简易的通过字符串创建XML文档。但在document.implementaion中引入了createDocument()方法

      createDocument()方法需要传递三个参数,命名空间,根标签,文档声明。命名空间,文档声明留空表示创建XMLDOM对象不需要命名空间和文档声明。

    1 var xmlDom2 = document.implementation.createDocument("","root",null);  //创建xmlDom
    2                 var user = xmlDom2.createElement("user2");
    3                 xmlDom2.getElementsByTagName("root")[0].appendChild(user);
    4                 var user2Text = xmlDom2.createTextNode("cc");
    5                 xmlDom2.getElementsByTagName("user2")[0].appendChild(user2Text);
    6                 alert(user2Text.innerHTML);  //undefind
              alert(user2Text.textContent);//cc

    二 2.DOM2中XML载入 

         DOM2只支持load()方法,载入一个同一台服务器的外部XML文件。也有async属性,表示同步或异步,默认异步 。
         DOM2级是没有.xml属性来序列化字符的。

    同步加载 

    1 var xmlDom = document.implementation.createDocument(" ","root",null);
    2                     xmlDom.async = false;
    3                     xmlDom.load("xml01.xml");
    4                     alert(xmlDom.getElementsByTagName("user")[0].tagName);

    异步加载

    1 var xmlDom = document.implementation.createDocument("", "root",null);
    2                         xmlDom.async = true;
    3                         addEvent(xmlDom,"load",function(){  //事件函数
    4                             alert(xmlDom.getElementsByTagName("user")[0].tagName);
    5                         });
    6                         xmlDom.load("xml01.xml");

    ps:load()方法只支持Firefox浏览器,和新版的Opera浏览器,其他的都不支持

    DOM2中xml的缺点:

      1.不能简易的使用字符串来创建XML,比如类似与IE的loadXML()方法
      2.不能够像IE中那样,通过.xml序列化XML字符串输出

    解决办法:

        DOM2级是没有loadXML()方法直接解析XML字符串,所以提供了DOMParser类型来创建XMLDOM对象。IE9,Safari,Chrome和Opera都支持这个类型。

        模拟loadXML()方法,可以简易的创建xml字符串

    1 var xmlParser = new DOMParser(); //创建DOMParser对象
    2 var xmlStr = "<root><user1>cici</user1></root>";  //XML字符串
    3 var xmlDom = xmlParser.parseFromString(xmlStr,"text/xml");//创建xml DOM对象
    4 alert(xmlDom.getElementsByTagName("user1")[0].tagName);//获取user元素标签名

        parseFromString( ," ")两个参数:一个是xml字符串,另一个是内容类型text/xml。

        XMLSerializer 类型  实现序列化XML字符串。IE9,Safari,Chrome和Opera都支持这个类型

          模拟.xml属性序列化字符串

    1 var serializer = new XMLSerializer();
    2 var xml = serializer.serializeToString(xmlDom);//序列化XML
    3 alert(xml);  //<root><user1>cici</user1></root>

        解析错误

    1 var errors = xmlDom.getElementsByTagName("parsererror");
    2     if (errors.length>0) {
    3         throw new Error("XML格式有误:" + errors[0].textContent);
    4     };

    跨浏览器兼容XML

      跨浏览器获取XML DOM

     1 function getXMLDOM(xmlStr){
     2             var xmlDom = null;
     3 
     4             if (typeof window.DOMParser != "undefind") {
     5                 xmlDom = (new DOMParser()).parseFromString(xmlStr,"text/xml");
     6                 var errors = xmlDom.getElementsByTagName("parsererror");
     7                 if (errors.length > 0) {
     8                     throw new Error("XML解析错误:" + errors[0].firstChild.nodeValue);
     9                 };
    10              }else if (typeof window.ActiveXObject != "undefind") {
    11                 var version = [
    12                     'MSXML2.DOMDocument.6.0',
    13                     'MSXML2.DOMDocument.3.0',
    14                     'MSXML2.DOMDocument'
    15                 ]
    16                 for(var i = 0; i<version.length;i++){
    17                     try{
    18                         xmlDom = new ActiveXObject(version[i]);
    19                     }catch(e){
    20 
    21                     }
    22 
    23                 }
    24                     xmlDom.loadXML(xmlStr);
    25                     if(xmlDom.parseError != 0 ){
    26                         throw new Error("XML解析错误:" + xmlDom.parseError.reason);
    27                     }
    28                     return xmlDomDom;
    29                 
    30                 }else{
    31                     throw new Error("您所使用的系统或浏览器不支持XML DOM!");
    32                     }
    33             return xmlDom;
    34         }

        跨浏览器序列化XML

    function serializerXML(){
                var xml = "";
                if (typeof XMLSerializer != "undefind" ) {
                    var xml = (new XMLSerializer()).serializeToString(xmlDom);
                }else if (typeof xmlDom.xml != "undefind") {
                    xml = xmlDom.xml;
                }else{
                    throw new Error("无法解析XML");
                };
                return xml;
            }
    
            var xmlStr = "<root><user2>Lee</user2></root>";
            var xmlDom = getXMLDOM(xmlStr);
            alert(serializerXML(xmlDom));
  • 相关阅读:
    JAVA-初步认识-常用对象API(集合框架-重点方法keyset演示图解)
    JAVA-初步认识-常用对象API(集合框架-常用方法演示)
    JAVA-初步认识-常用对象API(集合框架-Map集合特点常用方法)
    JAVA-初步认识-常用对象API(集合框架-练习-字符串长度排序)
    JAVA-初步认识-常用对象API(集合框架-treeset集合-二叉树)
    JAVA-初步认识-常用对象API(集合框架-treeset集合-Comparator比较器)9
    JAVA-初步认识-常用对象API(集合框架-treeset集合)
    JAVA-初步认识-常用对象API(集合框架-LinkedHashset集合)
    Spring整合hibernate的一个例子:用事务买书
    Spring整合hibernate的一个例子:用事务买书
  • 原文地址:https://www.cnblogs.com/wine/p/5148729.html
Copyright © 2011-2022 走看看