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文件中,当执行到最后一步时才写入数据库,这样最大限度的减少了数据库的访问,于是不得不纠结在各浏览器的兼容性的问题(悲哀啊.... ...
随机推荐
- Debian 8安装中文字体
1.使用的镜像是debian-8.3.0-amd64-kde-CD-1.iso,下载链接可在Debian网站找到,系统安装完成后中文显示为方框 2.安装字体 apt-get install xfont ...
- String类的compareTo()方法的源码解析
private final char value[]; 字符串会自动转换为一个字符数组. public int compareTo(String anotherString) { //this -- ...
- 数据库性能优化常用sql脚本总结
最近闲来无事,正好抽出时间,来总结总结 sql性能优化方面的一下小技巧,小工具.虽然都是些很杂的东西,但是我个人觉得,如果真的清楚了里面的一下指标,或许真的能抵半个DBA. 有些时候,找不到DBA或者 ...
- 深入理解javascript原型和闭包(12)——简介【作用域】
提到作用域,有一句话大家(有js开发经验者)可能比较熟悉:“javascript没有块级作用域”.所谓“块”,就是大括号“{}”中间的语句.例如if语句: 再比如for语句: 所以,我们在编写代码的时 ...
- C#深入浅出 继承(六)
这个标题写出来好长时间了,都没写内容,今天无论如何都得写完它,昨天写了一段,尼玛,电脑突然死机,重启之后啥都没了. 继承嘛,有人觉得很简单,但是里面还是有内容可以讲的,因为面向对象也就这么点内容,封装 ...
- $_SERVER 的用法
PHP编程中经常需要用到一些服务器的一些资料,特把$_SERVER的详细参数整理下,方便以后使用. $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 document root ...
- svn 版本转为git
git clone 相当于git init 和 git svn fetch.git svn rease git svn fetch 从svn服务器取指定区间的版本转化成git库 git svn reb ...
- Spring各jar包的作用
spring.jar是包含有完整发布的单个jar 包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到 spring-m ...
- php gettext 多语言翻译
1.在window与linux下的多语言切换有些区别,主要putenv的设置区别. 参考链接:http://www.cnblogs.com/sink_cup/archive/2013/11/20/ub ...
- jquery和dom之间的转换
刚开始学习jquery,可能一时会分不清楚哪些是jQuery对象,哪些是DOM对象.至于DOM对象不多解释,我们接触的太多了,下面重点介绍一下jQuery,以及两者相互间的转换. 什么是jQuery对 ...