//跨浏览器获取xmlDom

 function getXMLDOM(xmlStr) {
var xmlDom = null;
if (typeof window.DOMParser != 'undefined') {
xmlDom = (new DOMParser).parseFromString(xmlStr,'text/xml'); //创建xmlDom对象
var errors = xmlDom.getElementsByTagName('parsererror');
if(errors.length > 0) {
throw new Error('XML格式有误:'+errors[0].textContent);
}
return xmlDom;
} else if (typeof window.ActiveXObject != 'undefined') {
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]);
} catch (e) {
//遇到错误跳过,继续执行try
}
}
xmlDom.loadXML(xmlStr);
if(xmlDom.parseError != 0) { //使用 !+ 号
throw new Error('错误信息为:' + xmlDom.parseError.reason);
}
return xmlDom;
} else {
throw new Error('系统或浏览器不支持xmlDom对象!');
}
return xmlDom;
}

/*
DOM2没有序列化XML的属性,XMLSerializer类型来帮助序列化XML字符串。
IE9、Safari、Chrome和Opera都支持这个类型。
*/

 function serializerXML(xmlDom) {
var xml = null;
if(typeof window.XMLSerializer != 'undefined') {//w3c的序列化
var serializer = new XMLSerializer();
xml = serializer.serializeToString(xmlDom);
} else if(typeof xmlDom.xml != 'undefined') { //ie直接序列化
xml = xmlDom.xml;
}
return xml;
}

//跨浏览器获取xml单一节点

 function selectSingleNode(xmlDom,xpath) {
var node = null;
if(typeof xmlDom.evaluate != 'undefined') { //w3c
var patt = /\[(\d+)\]/;
var num = null;
var flag = xpath.match(patt);
if (flag) {
num = parseInt(RegExp.$1) + 1;//w3c下标从1开始,如0加1
xpath = xpath.replace(patt,'['+num+']'); //root/user[1]
}
var result = xmlDom.evaluate(xpath,xmlDom,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
if(result != null) {
node = result.singleNodeValue; //w3c默认的下标是1
}
} else if (typeof xmlDom.selectSingleNode != 'undefined') {//ie中unknown而非 undefined
node = xmlDom.selectSingleNode(xpath);
}
return node;
}

//跨浏览器获取xml所有节点

 function selectNodes(xmlDom,xpath) {
var nodes = [];
if(typeof xmlDom.evaluate != 'undefined') { //w3c
var patt = /\[(\d+)\]/;
var num = null;
var flag = xpath.match(patt);
if(flag) {
num = parseInt(RegExp.$1) + 1;
xpath = xpath.replace(patt,'['+num+']');
}
var result = xmlDom.evaluate(xpath,xmlDom,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
var node = null;
if(result != null) {
while ((node = result.iterateNext()) !== null) {
nodes.push(node);
}
}
} else if (typeof xmlDom.selectNodes != 'undefined') { //unkonwn
nodes = xmlDom.selectNodes(xpath);
}
return nodes;
}
 var xmlStr = '<root><name id="d1">du1</name><name id="d2">du2</name></root>';
var xmlDom = getXMLDOM(xmlStr);
var nodes = selectNodes(xmlDom,'root/name');
//alert(nodes.length);
//alert(serializerXML(xmlDom)); //序列化xmlStr
//alert(serializerXML(selectSingleNode(xmlDom,'root/name[0]'))); //序列化单一节点 alert(serializerXML(nodes[0]));//<name id="d1">du1</name>
alert(serializerXML(nodes[1]));

javascript跨浏览器操作xml的更多相关文章

  1. 第一百二十六节,JavaScript,XPath操作xml节点

    第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...

  2. 跨浏览器读取XML

    这里跨浏览器,但是只能读取字符串XML文档,可以通过Ajax方式load一个XML文档,将文件XML转变为字符串 // 跨浏览器返回XML DOM对象 function getXMLDOM(xmlSt ...

  3. JavaScript跨浏览器绑定事件函数的优化

    JavaScript作为一门基于事件驱动的语言(特别是用在DOM操作的时候),我们常常需要为DOM绑定各种各样的事件.然而,由于低版本的IE的不给力,在绑定事件和移除事件监听上都与众不同,我们常常需要 ...

  4. javascript跨浏览器事件对象类库

    一.前言 学习了javascript事件后,个人总结归纳了跨浏览器事件对象类库,方便以后使用,现分享给大家. 二.事件对象封装 将对浏览器事件对象的操作封装成eventObject.js方便调用 // ...

  5. JavaScript跨浏览器处理事件以及相关对象

    主流的浏览器和IE浏览器在处理事件和事件对象上是有所区别的,我们一般会通过EventUtil进行封装,这样,就可以正常的跨浏览器处理事件了,本文的主要内容总结自<JavaScript高级程序设计 ...

  6. Javascript跨浏览器的事件对象

    一.跨浏览器的事件对象 var EventUtil = { ///添加事件 addHandler: function (element, type, handler) { if (element.ad ...

  7. 封装常用的Javascript跨浏览器方法

    var EventUntil={ // 跨浏览器的添加事件方法 addHandler:function(element,type,handler){ if(element.addEventListen ...

  8. javascript 跨浏览器事件处理

    <div id="myDiv" style="width:100px; height:100px; border:1px solid #f00;"> ...

  9. JavaScript 【跨浏览器处理XML,做个兼容】

    //兼容方法        function getXMLDOM(xmlStr) {            var xmlDom = null;            if (typeof windo ...

随机推荐

  1. CF dp 题(1500-2000难度)

    前言 从后往前刷 update 新增 \(\text{\color{red}{Mark}}\) 标记功能,有一定难度的题标记为 \(\text{\color{red}{红}}\) 色. 题单 (刷过的 ...

  2. java程序员必知的 8大排序

    Java常用的八种排序算法与代码实现 排序问题一直是程序员工作与面试的重点,今天特意整理研究下与大家共勉!这里列出8种常见的经典排序,基本涵盖了所有的排序算法. 1.直接插入排序 我们经常会到这样一类 ...

  3. 重启uwsgi

    sudo pkill -f uwsgi -9 uwsgi --ini mysite.uwsgi.ini

  4. php import require include use vendor

    一.use  调用命名空间 用法. use app\common\controller\Index as commonIndex 或  use app\common\controller\Index ...

  5. asp.net中的ORA-12154: TNS: 无法解析指定的连接标识符

    本机PL/SQL能正常连接,但是asp.net连接有问题. 临时解决方案: <add key="ConnectString" value="Data Source= ...

  6. BZOJ 4180: 字符串计数 后缀自动机 + 矩阵乘法 + 二分(神题)

    Description SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999.   他给出了一个字符串T,字符串T中有且仅有4种字符 'A', 'B', 'C ...

  7. [JSOI2004]平衡点 / 吊打XXX 题解

    预备概念: 金属退火:将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度冷却 温度:一个逐渐减小的参数,表示接受次优解的概率 模拟退火是一种解决复杂问题的算法,相当于贪心,但以一个逐渐减小的该率接 ...

  8. 批量搞机(一):ansible简介、ansible安装

    一.ansible简介 Ansible是2013年推出的一款IT自动化和DevOps软件,目前由Redhat已签署Ansible收购协议.其是基于Python研发,糅合了很多老运维工具的优点实现了批量 ...

  9. Python 测评工具

    开源--Python测评工具 Github仓库 本次实验作业的测评工具仅使用Python语言编写. 程序思路是基于文本的快速匹配. 编译test.py运行 1.GUI界面 GUI界面使用了PyQt5完 ...

  10. Linux之虚拟机里的REHL7的IP

    RHEL7最小化安装之后(桥接模式),我们查看本机IP, ip addr ifconfig 我们要修改配置文件 找到目录 找到文件,用vi编辑器打开修改配置文件 保存退出后,需要重启网络服务 只有我们 ...