热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScriptXML操作实用工具类:XmlUtilsJS技巧与应用

demo用了点extjs的东西,主要是为了打印json数组出来。 js code(XmlUtils.js): 代码如下: /**/ function XmlUtils (


demo用了点extjs的东西,主要是为了打印json数组出来。
js code(XmlUtils.js):
代码如下:

/**/
function XmlUtils (config) {
/*定义私有属性*/
this.isIE = !!(window.attachEvent && !window.opera);
this.init();
if(config) {
this.dataType = config.dataType == 'json' ? 'json' : 'array';
if(config.xmlPath) this.loadXml(config.xmlPath);
}
}
XmlUtils.prototype = {
xmlDoc : null,
xmlPath : null,
dataType : null,
/**
* 初始化
*/
init : function () {
if (this.isIE) {
var activexArr = ["MSXML4.DOMDocument", "MSXML3.DOMDocument", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XmlDom"];
for(i=0; itry{
this.xmlDoc = new ActiveXObject(activexArr[i]);
}catch(e){}
}
} else {
this.xmlDoc = document.implementation.createDocument("", "", null);
}
},

/**
* 加载xml文件,参数:
* @param {string} xmlPath:加载的xml文件路径;
* @return {Object} true 正常加载; false 加载失败
*/
loadXml : function (xmlPath) {
try {
this.xmlDoc.async = false;
this.xmlDoc.load(xmlPath);
this.xmlPath = xmlPath;
return true;
} catch (e) {
return false;
}
},

/**
* 加载XML字符串
* @param {Object} XMLString
*/
loadXmlString: function(xmlString) {
if (this.isIE) {
this.xmlDoc.loadXML(xmlString);
} else {
var parser = new DOMParser();
this.XMLDoc = parser.parseFromString(xmlString, "text/xml");
}
},

/**
* 判断节点的是否有子节点
* @param {Object} node
* @return {Object} 有子节点则返回true,否则返回false
*/
hasChildNodes : function (node) {
return node.hasChildNodes();
},

/**
* 判断节点的是否有属性
* @param {Object} node
* @return {Object} 有属性则返回true,否则返回false
*/
hasAttributes : function (node) {
return (node.attributes.length > 0) ? true : false;
},

/**
* 判断节点的是否是文本节点,包括带CDATA区段的文本节点
* @param {Object} node
* @return {Object} 是文本节点则返回true,否则返回false
*/
isTextNode : function (node) {
var type = this.getNodeType(node);
return (type == 3 || type == 4) ? true : false;
},

/**
* 返回根节点
* @return {Object} 根节点
*/
getRoot : function () {
return this.xmlDoc.documentElement;
},

/**
* 返回节点的第一个子节点,没有参数则返回根节点的第一个子节点
* @param {Object} node
* @return {Object} 节点的第一个子节点
*/
getFirstChild : function (node) {
return node ? node.firstChild : this.getRoot().firstChild;
},

/**
* 返回节点的最后子节点,没有参数则返回根节点的第一个子节点
* @param {Object} node
* @return {Object} 节点的最后一个子节点
*/
getLastChild : function (node) {
return node ? node.lastChild : this.getRoot().lastChild;
},

/**
* 返回节点的下一个节点,没有参数则返回根节点的第一个子节点
* @param {Object} node
* @return {Object} 节点的下一个节点
*/
getNextNode : function (node) {
return node ? node.nextSibling : null;
},

/**
* 返回节点的上一个节点,没有参数则返回根节点的第一个子节点
* @param {Object} node
* @return {Object} 节点的上一个节点
*/
getPreviousNode : function (node) {
return node ? node.previousSibling : null;
},

/**
* 返回节点的子节点,没有参数则返回null
* @param {Object} node
* @return {Object} 节点所有子节点
*/
getChildNodes : function (node) {
return (node && this.hasChildNodes(node)) ? node.childNodes : null;
},

/**
* 返回节点的父节点,没有参数则返回null
* @param {Object} node
* @return {Object} 节点父节点
*/
getParentNode : function (node) {
return node ? node.parentNode : null;
},

/**
* 根据节点名返回节点数组文本值,参数:
* @param {string或object} nodeName:节点名称;
* @return {object} 节点存在返回节点数组;节点不存在则返回null。
*/
getNodesTextByName : function (nodeNames) {
return nodeNames ? (this.dataType == 'json' ? this.getJsonNodesTextByName(nodeNames) : this.getArryNodesTextByName(nodeNames)) : null;
},

/**
* 根据节点名返回节点普通数组文本值,参数:
* @param {string或object} nodeName:节点名称;
* @return {object} 节点存在返回节点普通数组。
*/
getArryNodesTextByName : function (nodeNames) {
var rs = [];
//返回普通数组格式
switch (typeof(nodeNames)) {
case 'string':
var nodes = this.getNodesByTagName(nodeNames);
for (var i = 0; i rs.push(nodes[i].text);
}
break;
case 'object':
var subRs;
var nodes;
for (var i = 0; i nodes = this.getNodesByTagName(nodeNames[i]);
subRs = [];
for (var j = 0; j subRs.push(nodes[j].text);
}
rs.push(subRs);
}
break;
}
return rs;
},

/**
* 根据节点名返回节点JSON数组文本值,参数:
* @param {string或object} nodeName:节点名称;
* @return {object} 节点存在返回节点JSON数组;节点不存在则返回null。
*/
getJsonNodesTextByName : function (nodeNames) {
var rs = null;
//返回JSON数组格式
switch (typeof(nodeNames)) {
case 'string':
eval('rs = {' + nodeNames + ':[]}');
var nodes = this.getNodesByTagName(nodeNames);
for (var i = 0; i eval('rs.' + nodeNames + '.push({' + nodeNames + i + ': nodes[i].text})');
}
break;
case 'object':
rs = {};
var nodes;
for (var i = 0; i eval('rs.' + nodeNames[i] + '=[]');
nodes = this.getNodesByTagName(nodeNames[i]);
for (var j = 0; j eval('rs.' + nodeNames[i] + '.push({' + nodeNames[i] + j + ': nodes[j].text})');
}
}
break;
}
return rs;
},

/**
* 根据节点属性得到节点,参数:
* @param {String} key:属性名,默认是id
* @param {String} value:属性值
* @return {String} 符合条件的节点数组。
*/
getNodesByAttribute : function (key, value) {
key = key ? key : 'id';
value = value ? value : '';
return id ? this.xmlDoc.getElementById(id) : null;
},

/**
* 根据节点名得到节点,参数:
* @param {string} tagName:节点名称
* @return {string} 指定节点名字的和位置的节点或节点数组。
*/
getNodesByTagName : function (tagName) {
return tagName ? this.xmlDoc.getElementsByTagName(tagName) : null;
},

/**
* 根据节点路径返回第index个节点,参数:
* @param {string} xPath:节点路径
* @param {number}index:要索引的位置,为空或0则返回所有查找到的节点。
* @return {string} 指定节点名字的和位置的节点或节点数组。
*/
getNodesByXpath : function (xPath, index) {
if (!xPath) return null;
var nodes = this.xmlDoc.selectNodes(xPath);
var len = nodes.length;
if(!index || index > len || index <0) return nodes;
for(var i=0; iif(i == index - 1) return nodes[i];
}
},

/**
* 得到指定节点文本,参数:
* @param {object} node:节点
* @return {string} 节点文本,为空则返回null
*/
getText : function (node) {
return node ? node.text : null;
},

/**
* 得到指定节点名称,参数:
* @param {object} node:节点
* @return {string} 节点名称,为空则返回null
*/
getTagName : function (node) {
return node ? node.nodeName : null;
},

/**
* 返回节点类型,参数:
* @param {object} node:节点
* @return {string} 节点类型,为空则返回null
* 1-element
* 2-attribute
* 3-text
* 4-cdata
* 5-entity reference
* 6-entity
* 7-pi (processing instruction)
* 8-comment
* 9-document
* 10-document type
* 11-document fragment
* 12-notation
*/
getNodeType : function (node) {
return node ? node.nodeType : null;
},

/**
* 创建节点,参数:
* @param {string} nodeName:节点名称,必填
* @param {string} text:节点文本,可为空
* @param {Object} attributes:属性值-JSON数组,可为空,例:{id:&#39;id001&#39;,name:&#39;name001&#39;}
* @param {Object} node:要增加子节点的节点,为空则返回新建的节点
* @param {Boolean} cdata:是否生成带有CDATA区段的节点,true:生成,false:不生成
* @return {Object} 创建的节点,有异常则返回null
*/
createNode: function(nodeName, text, attributes, node, cdata) {
if (this.isIE) {
//创建子接点
var childNode = this.xmlDoc.createElement(nodeName);
//创建文本节点
var textNode = cdata == true ? this.xmlDoc.createCDATASection(text) : this.xmlDoc.createTextNode(text);
childNode.appendChild(textNode);
//添加属性
for (var i in attributes) {
this.createAttribute(childNode,i,attributes[i]);
};

return node ? node.appendChild(childNode) : childNode;
} else {
alert(&#39;FF创建节点再说.&#39;);
return null;
}
},

/**
* 创建带CDATA区段的节点,参数:
* @param {string} nodeName:节点名称,必填
* @param {string} text:节点文本,可为空
* @param {Object} attributes:属性值-JSON数组,可为空,例:{id:&#39;id001&#39;,name:&#39;name001&#39;}
* @param {Object} node:要增加子节点的节点,为空则返回新建的节点
*/
createCDATANode: function(nodeName, text, attributes, node) {
this.createNode(nodeName, text, attributes, node, true);
},

/**
* 创建节点属性,参数:
* @param {Object} node:节点,必填
* @param {String} key:属性名,必填
* @param {Object} value:属性值,必填
* @param {Object} node:返回新增属性的节点
* @return {Object} 增加属性的节点,有异常则返回null
*/
createAttribute: function(node, key, value) {
if (this.isIE) {
if(!key) return;
var attr = this.xmlDoc.createAttribute(key);
attr.value = value ? value : "";
node.setAttributeNode(attr);
return node;
} else {
alert(&#39;FF创建节点再说.&#39;);
return node;
}
return null;
},

/**
* 把节点加到根节点上,参数:
* @param {Object} node:节点
* @return {Object} 有异常则返回null
*/
addNodeToRoot: function(node) {
if(!node) return null;
this.getRoot().appendChild(node);
return node;
},

/**
* 把节点加到另外节点上,参数:
* @param {Object} node:节点
*/
addNode: function(node,childNode) {
return (node && childNode) ? node.appendChild(childNode) : false;
},

/**
* 从父节点移除节点自身,参数:
* @param {Object} newNode:要替换的节点
* @param {Object} oldNode:要被替换的节点
*/
replaceChild: function(newNode, oldNode) {
var parentNode = oldNode.parentNode;
if(!newNode || !oldNode || !parentNode) return;
parentNode.replaceChild(newNode, oldNode);
},

/**
* 从父节点移除节点自身,参数:
* @param {Object} node:要移除的节点
*/
removeChild: function(node) {
if(!node || !node.parentNode) return;
node.parentNode.removeChild(node);
},

/**
* 移除节点的所有子节点,参数:
* @param {Object} node:父节点
*/
removeChildNodes: function(node) {
if (node && this.hasChildNodes(node)) {
var childNodes = node.childNodes;
for(var i = 0; i node.removeChild(childNodes[0]);
}
}
},

/**
* 设置节点属性值,不存在则新建,参数:
* @param {Object} node:要设置的节点
* @param {String} key:要设置的属性名
* @param {String} value:要设置的属性值
*/
setAttribute: function(node, key, value) {
this.createAttribute(node, key, value);
},

/**
* 设置文本节点的文本,参数:
* @param {Object} node:要设置的节点
* @param {String} text:要设置的文本
*/
setText: function(node, text) {
if(this.isTextNode(node)) node.text = text;
},

/**
* 在文本节点后面追加文本,参数:
* @param {Object} node:要设置的节点
* @param {String} text:要设置的文本
*/
appendText: function(node, text) {
if(this.isTextNode(node)) node.appendData(text);
},


/**
* 输出xml,为空则输出根节点文本,参数:
* @param {Object} node:要输出的节点
*/
toString: function(node) {
node = node ? node : this.xmlDoc.documentElement;
if (typeof node == &#39;string&#39;) return node;
return this.isIE ? node.xml : new XMLSerializer().serializeToString(node);
}
}

测试的xml文件(book.xml):
代码如下:




西游记
吴承恩


红楼梦
曹雪芹


三国演义

施耐庵




水浒传
罗贯中



html code (test.html):
代码如下:














推荐阅读
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 探讨在循环中调用$.post()时,回调函数为何会在循环结束后才开始执行,并提供解决方案和优化建议。 ... [详细]
  • 本文探讨了在Java中实现系统托盘最小化的两种方法:使用SWT库和JDK6自带的功能。通过这两种方式,开发者可以创建跨平台的应用程序,使窗口能够最小化到系统托盘,并提供丰富的交互功能。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • 谷粒商城统一返回对象R的泛型data获取异常及解决方案
    在实现过程中遇到空指针错误,经过定位发现远程调用后使用泛型的统一返回对象R无法正确获取data值。本文详细分析问题原因并提供解决方案。 ... [详细]
  • JavaScript实现表格数据的实时筛选功能
    本文介绍如何使用JavaScript实现对表格数据的实时筛选,帮助开发者提高用户体验。通过简单的代码示例,展示如何根据用户输入的关键字动态过滤表格内容。 ... [详细]
  • 本文探讨了在UC浏览器中调用分享面板后,图片无法正常显示的问题,并提供了详细的解决方法和代码示例。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
author-avatar
拍友2702936504
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有