JS:XML
一 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的更多相关文章
- Ajax:异步的JS和XML
1.Ajax1) AJAX 是 Asynchronous JavaScript And XML 的简称.直译为,异步的JS和XML.2) AJAX的实际意义是,不发生页面跳转.异步载入内容并改写页面内 ...
- CSS控制XML与通过js解析xml然后通过html显示xml中的数据
使用CSS控制XML的显示 book.css bookname{ display:block;color:Red} author{ display:block;font-style:italic} p ...
- eclipse导入html、js、xml报错的问题
今天重新安装eclipse,在导入部分html.js.xml文件,报错,解决办法如下: eclipse->window->preferences->Team,点击validation ...
- node.js 解析xml BOM问题(xmlreader sax.js)
Email:longsu2010 at yeah dot net 之前写了两篇文章关于node.js解析xml,说的是xmlreader,文章如下 node.js解析xml(xmlreader) no ...
- js创建xml对象
js创建xml对象 //创建对象 function getDataXML() { var objTds = $("TEXTAREA"); var count = o ...
- js 读取xml文件
读取xml文件 [原创 2007-6-20 17:35:37] 字号:大 中 小 js中读取xml文件,简单的例子: <html><head><script> ...
- js 对XML文件的保存与读取
一.保存(在前端用js创建xml格式) function exportToXml(jsonStr){ var obj = eval('('+ jsonStr + ')'); var xmlDoc = ...
- JS读取XML文件数据并以table显示数据(兼容IE火狐)
先看xml文件: <?xml version="1.0" standalone="yes"?> <student> <stuinf ...
- js操作XML文件兼容IE与FireFox
最近项目中用到了xml,需求是用户安装产品时先把一系列的数据保存到xml文件中,当执行到最后一步时才写入数据库,这样最大限度的减少了数据库的访问,于是不得不纠结在各浏览器的兼容性的问题(悲哀啊.... ...
随机推荐
- [Unity3D]添加音效说明
添加音效组件并添加音乐资源 其中Pitch用来提高和降低音调的,比如可以和赛车游戏的轮胎绑定,当轮胎越快,则音调越高 2D/3D音效:2D音效和摄影家的距离无关,可以看做是一个背景音乐:而3D音效则是 ...
- CSS3实现阴阳鱼
直接上代码: <!doctype html> <html> <head> <meta charset="utf-8" /> < ...
- 深入理解javascript原型和闭包(7)——原型的灵活性
在Java和C#中,你可以简单的理解class是一个模子,对象就是被这个模子压出来的一批一批月饼(中秋节刚过完).压个啥样,就得是个啥样,不能随便动,动一动就坏了. 而在javascript中,就没有 ...
- 使用JSF框架过程中的若干典型问题及其解决方案
1.commandXxx点击后,不调用action中的方法: 原因1:xhtml后缀名的文件,最终也会转化为普通的html文件(这是熟悉JSF框架的关键.),commandXxx点击后不调用后台act ...
- Linux文件查找命令 find 详解
关于find命令 由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下.即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权 ...
- C和指针 第八章 数组
8.1 数组名和指针 int a; int b[10]; a称为一个标量,表示一个单一的值,变量的类型是整数. b是数组,b[1]的类型是整数,b是一个指针常量,表示数组第一个元素的地址.b的类型取决 ...
- 多种JSON格式及遍历方式
/*数组*/ var arr = [["name", "value"], ["name1", "value1"]]; v ...
- 35.两链表的第一个公共结点[Find the first common node of two linked list]
[题目] 两个单向链表,找出它们的第一个公共结点. 链表的结点定义为: C++ Code 123456 struct ListNode { int m_nKey; ...
- HtmlAgilityPack 学习和笔记
介绍: http://www.cnblogs.com/bomo/archive/2013/01/28/2879361.html 实战 c#获取外网ip 网址:http://ip138.com/ 如图: ...
- Websocket通讯简析
什么是Websocket Websocket是一种全新的协议,不属于HTTP无状态协议,协议名为"ws",这意味着一个Websocket连接地址会是这样的写法:ws://**.We ...