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 楊軍威 閱讀(273) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 黄山市| 白玉县| 湖口县| 宁南县| 南安市| 永寿县| 博客| 句容市| 石首市| 呼玛县| 新泰市| 洪洞县| 沧州市| 梨树县| 芮城县| 磐石市| 永昌县| 平罗县| 榆中县| 会泽县| 会东县| 公主岭市| 庆安县| 尼勒克县| 县级市| 蒙阴县| 砀山县| 梁河县| 高淳县| 中江县| 呼伦贝尔市| 巴林左旗| 精河县| 朝阳县| 郯城县| 定陶县| 仁寿县| 习水县| 德阳市| 应城市| 武城县|