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文件中,当执行到最后一步时才写入数据库,这样最大限度的减少了数据库的访问,于是不得不纠结在各浏览器的兼容性的问题(悲哀啊.... ...
随机推荐
- 【WIN10】绑定x:Bind
在WP8.WP8中,我们知道有一个绑定{Binding},而在Win10中,新增了一个绑定{x:Bind} x:Bind :为编译时绑定 ,内存.内存相对于传统绑定都有优化 特性: 1.为强类型 ...
- nyoj 下三角矩阵
Problem A 下三角矩阵 时间限制:1000 ms | 内存限制:65535 KB 描述 给定一个由0和1组成的矩阵.只允许交换相邻的两行,要把矩阵转化成下三角矩阵(主对角线上方的元素都是0 ...
- 评价cnblogs.com的用户体验
我们作为大学计算机科学与技术专业的本科生,使用博客园主要是用来搜索和阅读技术资料,并且使用它来编辑发表博客.我们偏向于搜索便捷,界面友好的网站风格.我们对cnblogs的期望是更便捷精准,更便于编辑. ...
- table td 文字超出显示省略号
.autocut { width:250px; overflow:hidden; white-space:nowrap; text-overflow:ellip ...
- 用原生js实现的链式调用函数
<!doctype html><html lang="en"><head> <meta charset="UTF-8" ...
- [vijos1459]车展
[vijos1459]车展 试题描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n辆车,从左到右依次编号为1,2,-,n,每辆车都有一个展台.刚开始每个展台都 ...
- Apache Rewrite匹配问号的问题
在写RewriteRule准备匹配url中的问号及后面的参数时,怎么弄都无法成功.正则的写法经过测试是正确的,问号也已经转义\?,可还是不行. 百度查询了下,RewriteRule 不会去匹配问号?后 ...
- 分享一个Visual Studio的背景插件,让堆码更富情趣
忘记一件重要的事情,我使用的是VS 2012版,其他更高版本应该是可以找到的,以下版本就不清楚了.有可能找不到,见谅,也不是我开发的,只是偶尔碰到,拿出来让大家知道. 上周某日,新生命群里面还是一如既 ...
- 安装配置LDAP遇到的问题
问题1:安装完启动ldap服务报错: ldap: unrecognized service? 原因在于新版的openldap将服务名改为了slapd,使用service slapd start即可启动 ...
- Linux Swap分区设定
因为准备在linux上面安装Oracle数据库,据说swap分区小于4G容易失败,天啦噜的我连swap分区是啥都不是非常清楚, 大概有个印象吧,但先搞大了再说. 测试证明Ubuntu14默认的swap ...