博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[JavaScript] 兼容IE、FireFox、Chrome等浏览器的xml处理函数(xml同步/异步加载、xsl转换、selectSingleNode、selectNodes)...
阅读量:5961 次
发布时间:2019-06-19

本文共 4521 字,大约阅读时间需要 15 分钟。

  在编写处理xml的网页时,经常为浏览器兼容性头疼。于是我将常用的xml操作封装为函数。经过一段时间的改进,现在已经很稳定了,用起来很舒服。

 

  函数有——

xml_loadFile:xml同步/异步加载。

xml_transformNode:xsl转换。

xml_text:节点的文本。

selectSingleNode:根据XPath选择单个节点。

selectNodes:根据XPath选择多个节点。

 

  全部代码(zyllibjs_xml.js)——

/* zyllibjs_xml XML处理 @author zyl910 注意—— 1. Chrome 由于其安全机制限制, 不能读取本地文件。 Reference ~~~~~~~~~ http://www.jinlie.net/?p=302 Chrome浏览器加载XML文档 Update ~~~~~~ [2011-11-02] 定义。 [2011-11-09] xml_loadFile: 为回调函数加上isError参数。 [2011-11-21] selectSingleNode selectNodes */ // 加载XML文件并返回XML文档节点 // return:    成功时返回一个对象(同步模式下返回xml文档对象,异步模式下返回操作对象),失败时返回空。 // xmlUrl: xml文件的url。 // funcAsync: 回调函数. function onload(xmlDoc, isError){ ... } function xml_loadFile(xmlUrl, funcAsync) {
var xmlDoc = null; var isChrome = false; var asyncIs = (null!=funcAsync); // 是否是异步加载。当funcAsync不为空时,使用异步加载,否则是同步加载。 // 检查参数 if (""==xmlUrl) return null; if (asyncIs) {
if ("function"!=typeof(funcAsync)) return null; } // 创建XML对象 try {
xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); // Support IE } catch(ex) {
} if (null==xmlDoc) {
try {
// Support Firefox, Mozilla, Opera, etc xmlDoc = document.implementation.createDocument("", "", null); // 创建一个空的 XML 文档对象。 } catch(ex) {
} } if (null==xmlDoc) return null; // 加载XML文档 xmlDoc.async = asyncIs; if (asyncIs) {
if(window.ActiveXObject) {
xmlDoc.onreadystatechange = function(){
if(xmlDoc.readyState == 4) {
var isError = false; if (null!=xmlDoc.parseError) {
isError = (0!=xmlDoc.parseError.errorCode); // 0成功, 非0失败。 } funcAsync(xmlDoc, isError); } } } else {
xmlDoc.onload = function(){
funcAsync(xmlDoc, false); } } } try {
xmlDoc.load(xmlUrl); } catch(ex) {
// alert(ex.message) // 如果浏览器是Chrome,则会catch这个异常:Object # (a Document) has no method "load" isChrome = true; xmlDoc = null; } if (isChrome) {
var xhr = new XMLHttpRequest(); if (asyncIs) // 异步 {
xhr.onreadystatechange = function(){
if(xhr.readyState == 4) {
funcAsync(xhr.responseXML, xhr.status != 200); } } xhr.open("GET", xmlUrl, true); try // 异步模式下,由回调函数处理错误。 {
xhr.send(null); } catch(ex) {
funcAsync(null, true); return null; } return xhr; // 注意:返回的是XMLHttpRequest。建议异步模式下仅用null测试返回值。 } else // 同步 {
xhr.open("GET", xmlUrl, false); xhr.send(null); // 同步模式下,由调用者处理异常 xmlDoc = xhr.responseXML; } } return xmlDoc; } // 使用XSLT把XML文档转换为一个字符串。 function xml_transformNode(xmlDoc, xslDoc) {
if (null==xmlDoc) return ""; if (null==xslDoc) return ""; if (window.ActiveXObject) // IE {
return xmlDoc.transformNode(xslDoc); } else // FireFox, Chrome {
//定义XSLTProcesor对象 var xsltProcessor=new XSLTProcessor(); xsltProcessor.importStylesheet(xslDoc); // transformToDocument方式 var result=xsltProcessor.transformToDocument(xmlDoc); var xmls=new XMLSerializer(); var rt = xmls.serializeToString(result); return rt; } } // 得到节点的文本 function xml_text(xmlNode) {
if (null==xmlNode) return ""; var rt; if (window.ActiveXObject) // IE {
rt = xmlNode.text; } else {
// FireFox, Chrome, ... rt = xmlNode.textContent; } if (null==rt) rt=xmlNode.nodeValue; // XML DOM return rt; } // 添加方法。为了兼容FireFox、Chrome。 if (!window.ActiveXObject) {
XMLDocument.prototype.selectSingleNode = Element.prototype.selectSingleNode = function (xpath) {
var x = this.selectNodes(xpath) if ( ! x || x.length < 1 ) return null ; return x[ 0 ]; } XMLDocument.prototype.selectNodes = Element.prototype.selectNodes = function (xpath) {
var xpe = new XPathEvaluator(); var nsResolver = xpe.createNSResolver( this.ownerDocument == null?this.documentElement : this.ownerDocument.documentElement); var result = xpe.evaluate(xpath, this , nsResolver, 0 , null ); var found = []; var res; while (res = result.iterateNext()) found.push(res); return found; } }

 

转载地址:http://ucjax.baihongyu.com/

你可能感兴趣的文章
HDU1848 Fibonacci again and again
查看>>
HTML思维导图
查看>>
office2016选择性安装
查看>>
C# 自定义控件入门
查看>>
git改密码出现授权问题
查看>>
Hadoop IO 特性详解(2)
查看>>
ORA-02266: 表中的唯一/主键被启用的外键引用
查看>>
5(绪论).时间复杂度和空间复杂度-3
查看>>
MySQL类型转换 使用CAST将varchar转换成int类型排序
查看>>
Django的POST请求时因为开启防止csrf,报403错误,及四种解决方法
查看>>
Apache common-fileupload用户指南
查看>>
day-6 and day-7:面向对象
查看>>
COM基础
查看>>
IE维护(IEM)策略不再适用于IE10及后续IE版本
查看>>
Java7中的ForkJoin并发框架初探(下)—— ForkJoin的应用
查看>>
java中的重量级与轻量级概念
查看>>
Linux设备驱动工程师之路——硬件访问及混杂设备LED驱动
查看>>
进程和线程<一>
查看>>
远程算数程序——版本v1.0
查看>>
Mysql常见四种索引的使用
查看>>