一 IE中的XML

  //1.创建XMLDOM对象
 //创建XMLDOM对象
var xmlDom = new ActiveXObject("MSXML2.DOMDocument.6.0"); //IE9之前使用
function createXMLDOM () {
var version = [
'MSXML2.DOMDocument.6.0',
'MSXML2.DOMDocument.3.0',
'MSXML2.DOMDocument' ]; for(var i = 0; i<version.length;i++){
try{
var xmlDom = new ActiveXObject(version[i]); //IE中的
return xmlDom;
}catch(e){
//跳过
}
}
throw new Error("您的系统或浏览器不支持MSXML!");
}

  

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

 var xmlDom = createXMLDOM();
xmlDom.loadXML("<root>\n<user>cc</user>\n</root>"); //loadXML()加载内部文件
alert(xmlDom.xml); //.xml属性可以序列化XML,获取整个XML字符串。
var user = xmlDom.getElementsByTagName("user")[0];
alert(user.tagName);
alert(user.innerHTML); //innerHTML不是标准DOM
alert(user.firstChild.nodeValue); var xmlDom02 = createXMLDOM();
xmlDom02.load("xml01.xml"); //load()加载外部文件
var bbb = xmlDom02.createElement("bbb");
var root = xmlDom02.documentElement;
var bbbText = xmlDom02.createTextNode("kkk");
bbb.appendChild(bbbText);
root.appendChild(bbb);
alert(xmlDom02.xml);

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

    //使用同步加载文件

    

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

    //使用异步加载文件

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

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

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

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

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

  解析错误

二 DOM2中的XML

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

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

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

二 2.DOM2中XML载入 

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

同步加载 

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

异步加载

 var xmlDom = document.implementation.createDocument("", "root",null);
xmlDom.async = true;
addEvent(xmlDom,"load",function(){ //事件函数
alert(xmlDom.getElementsByTagName("user")[0].tagName);
});
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字符串

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

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

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

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

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

    解析错误

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

跨浏览器兼容XML

  跨浏览器获取XML DOM

 function getXMLDOM(xmlStr){
var xmlDom = null; if (typeof window.DOMParser != "undefind") {
xmlDom = (new DOMParser()).parseFromString(xmlStr,"text/xml");
var errors = xmlDom.getElementsByTagName("parsererror");
if (errors.length > 0) {
throw new Error("XML解析错误:" + errors[0].firstChild.nodeValue);
};
}else if (typeof window.ActiveXObject != "undefind") {
var version = [
'MSXML2.DOMDocument.6.0',
'MSXML2.DOMDocument.3.0',
'MSXML2.DOMDocument'
]
for(var i = 0; i<version.length;i++){
try{
xmlDom = new ActiveXObject(version[i]);
}catch(e){ } }
xmlDom.loadXML(xmlStr);
if(xmlDom.parseError != 0 ){
throw new Error("XML解析错误:" + xmlDom.parseError.reason);
}
return xmlDomDom; }else{
throw new Error("您所使用的系统或浏览器不支持XML DOM!");
}
return xmlDom;
}

    跨浏览器序列化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));

JS:XML的更多相关文章

  1. Ajax:异步的JS和XML

    1.Ajax1) AJAX 是 Asynchronous JavaScript And XML 的简称.直译为,异步的JS和XML.2) AJAX的实际意义是,不发生页面跳转.异步载入内容并改写页面内 ...

  2. CSS控制XML与通过js解析xml然后通过html显示xml中的数据

    使用CSS控制XML的显示 book.css bookname{ display:block;color:Red} author{ display:block;font-style:italic} p ...

  3. eclipse导入html、js、xml报错的问题

    今天重新安装eclipse,在导入部分html.js.xml文件,报错,解决办法如下: eclipse->window->preferences->Team,点击validation ...

  4. node.js 解析xml BOM问题(xmlreader sax.js)

    Email:longsu2010 at yeah dot net 之前写了两篇文章关于node.js解析xml,说的是xmlreader,文章如下 node.js解析xml(xmlreader) no ...

  5. js创建xml对象

    js创建xml对象 //创建对象 function getDataXML() {     var objTds = $("TEXTAREA");     var count = o ...

  6. js 读取xml文件

    读取xml文件 [原创 2007-6-20 17:35:37]     字号:大 中 小 js中读取xml文件,简单的例子: <html><head><script> ...

  7. js 对XML文件的保存与读取

    一.保存(在前端用js创建xml格式) function exportToXml(jsonStr){ var obj = eval('('+ jsonStr + ')'); var xmlDoc = ...

  8. JS读取XML文件数据并以table显示数据(兼容IE火狐)

    先看xml文件: <?xml version="1.0" standalone="yes"?> <student> <stuinf ...

  9. js操作XML文件兼容IE与FireFox

    最近项目中用到了xml,需求是用户安装产品时先把一系列的数据保存到xml文件中,当执行到最后一步时才写入数据库,这样最大限度的减少了数据库的访问,于是不得不纠结在各浏览器的兼容性的问题(悲哀啊.... ...

随机推荐

  1. [Unity3D]添加音效说明

    添加音效组件并添加音乐资源 其中Pitch用来提高和降低音调的,比如可以和赛车游戏的轮胎绑定,当轮胎越快,则音调越高 2D/3D音效:2D音效和摄影家的距离无关,可以看做是一个背景音乐:而3D音效则是 ...

  2. CSS3实现阴阳鱼

    直接上代码: <!doctype html> <html> <head> <meta charset="utf-8" /> < ...

  3. 深入理解javascript原型和闭包(7)——原型的灵活性

    在Java和C#中,你可以简单的理解class是一个模子,对象就是被这个模子压出来的一批一批月饼(中秋节刚过完).压个啥样,就得是个啥样,不能随便动,动一动就坏了. 而在javascript中,就没有 ...

  4. 使用JSF框架过程中的若干典型问题及其解决方案

    1.commandXxx点击后,不调用action中的方法: 原因1:xhtml后缀名的文件,最终也会转化为普通的html文件(这是熟悉JSF框架的关键.),commandXxx点击后不调用后台act ...

  5. Linux文件查找命令 find 详解

    关于find命令 由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下.即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权 ...

  6. C和指针 第八章 数组

    8.1 数组名和指针 int a; int b[10]; a称为一个标量,表示一个单一的值,变量的类型是整数. b是数组,b[1]的类型是整数,b是一个指针常量,表示数组第一个元素的地址.b的类型取决 ...

  7. 多种JSON格式及遍历方式

    /*数组*/ var arr = [["name", "value"], ["name1", "value1"]]; v ...

  8. 35.两链表的第一个公共结点[Find the first common node of two linked list]

    [题目] 两个单向链表,找出它们的第一个公共结点. 链表的结点定义为:  C++ Code  123456   struct ListNode {     int         m_nKey;    ...

  9. HtmlAgilityPack 学习和笔记

    介绍: http://www.cnblogs.com/bomo/archive/2013/01/28/2879361.html 实战 c#获取外网ip 网址:http://ip138.com/ 如图: ...

  10. Websocket通讯简析

    什么是Websocket Websocket是一种全新的协议,不属于HTTP无状态协议,协议名为"ws",这意味着一个Websocket连接地址会是这样的写法:ws://**.We ...