JS操作XML工具类-XmlUtils 本帖最后由 leadergg 于 2010-03-06 20:29:52 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 /** * 返回节点类型,参数: * @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:'id001',name:'name001'} * @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('FF创建节点再说.'); return null; } }, /** * 创建带CDATA区段的节点,参数: * @param {string} nodeName:节点名称,必填 * @param {string} text:节点文本,可为空 * @param {Object} attributes:属性值-JSON数组,可为空,例:{id:'id001',name:'name001'} * @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('FF创建节点再说.'); 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 < childNodes.length; 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 == 'string') return node; return this.isIE ? node.xml : new XMLSerializer().serializeToString(node); } } [/code] 测试的xml文件(book.xml):<?xml version="1.0" encoding="utf-8"?> <root> <book> <name>西游记</name> <author>吴承恩</author> </book> <book> <name>红楼梦</name> <author>曹雪芹</author> </book> <book> <name>三国演义</name> <author> <name>施耐庵</name> <sex>男</sex> </author> </book> <book> <name>水浒传</name> <author>罗贯中</author> </book> </root>[code][code=HTML]<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <mce:script language="JavaScript" type="text/javascript" src="../Ext/ext-base.js" mce_src="Ext/ext-base.js"><!-- // --></mce:script> <mce:script language="JavaScript" type="text/javascript" src="../Ext/ext-all.js" mce_src="Ext/ext-all.js"><!-- // --></mce:script> <title>测试xml</title> <mce:script src="XmlUtils.js" mce_src="XmlUtils.js"></mce:script> </head> <body> <div id='xmlOpTest'></div> </body> <mce:script type="text/javascript"><!-- /** * config参数:xmlPath文件地址;dataType数据格式-json或arry,默认为array。 */ var xmlUtils = new XmlUtils({xmlPath:"book.xml",dataType:'json'}); alert(xmlUtils.toString()); var rs = xmlUtils.getNodesTextByName(['name','author']); //把上面的dataType改为array或者不为json此处就能得到值 document.getElementById('xmlOpTest').innerHTML += '<br/>取得所有的文本节点的数组: '+rs + '<br/>'; //这里用了Ext的json解析工具 Ext.encode这个方法是把json对象转换为字符串。Ext.decode则相反,把json格式的字符串转换为json对象数组 document.getElementById('xmlOpTest').innerHTML += '<br/>取得所有的文本节点的JSON数组: '+Ext.encode(rs)+'<br/>'; var root = xmlUtils.getRoot(); xmlUtils.createNode('publish', '中国电力出版社',{id:'id0001'},root); xmlUtils.createCDATANode('publish', '中国&电力出版社',{},root); //设置属性 xmlUtils.setAttribute(root,'testId','test'); //修改属性 xmlUtils.setAttribute(root,'testId','test0000000000'); alert(xmlUtils.toString(root)); xmlUtils.removeChild(xmlUtils.getNodesByXpath('//root/publish')[0]); alert(xmlUtils.toString(root)); node = xmlUtils.getFirstChild(); document.getElementById('xmlOpTest').innerHTML += '<br/>判断是否有子节点: '+xmlUtils.hasChildNodes(node) + ' ------ 判断是否有属性:';//+ xmlUtils.hasAttributes(node) +'<br/>'; document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的第一个节点: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +' ======== 节点类型:' + xmlUtils.getNodeType(node) + '<br/>'; node = xmlUtils.getNextNode(node); document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的第一个节点下一个节点: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +'<br/>'; node = xmlUtils.getLastChild(); document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的最后一个节点: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +'<br/>'; node = xmlUtils.getPreviousNode(node); document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的最后一个前一个节点: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +'<br/>'; node = xmlUtils.getParentNode(node); document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的父节点: '+ xmlUtils.toString(node) +'<br/>'; var nodes = xmlUtils.getChildNodes(); document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的所有子节点: '+xmlUtils.toString(nodes)+'<br/>'; node = xmlUtils.getNodesByXpath('//root/book/name',2); document.getElementById('xmlOpTest').innerHTML += '<br/>根据xPath得到节点名称和文本值: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node)+'<br/>'; node = xmlUtils.getNodesByXpath('//root/book/author'); document.getElementById('xmlOpTest').innerHTML += '<br/>根据xPath得到节点名称和文本值: '+xmlUtils.getTagName(node[0]) + "---" + xmlUtils.getText(node[0])+'<br/>'; //得到修改后的文本节点 node = xmlUtils.getNodesByXpath('//root/publish',1); node = xmlUtils.getFirstChild(node); document.getElementById('xmlOpTest').innerHTML += '<br/>修改文本值前节点文本: '+xmlUtils.getText(node); xmlUtils.setText(node,"西游记后传"); document.getElementById('xmlOpTest').innerHTML += '-----修改文本值后节点文本: '+xmlUtils.getText(node); xmlUtils.appendText(node,"之测试"); document.getElementById('xmlOpTest').innerHTML += '-----追加文本值后节点文本: '+xmlUtils.getText(node) + "<br/>"; // --></mce:script> </html>上面的文件都上传了,下载地址 http://download.csdn.net/source/1708635 - -,需要這么麻煩么?把xml當做html的dom操作就行了啊 顶一下 我现在用js 解析xml 全部是创建MSXML4.DOMDocumen 写的不错 不过ff浏览器上 支持不是很好 ie ok xml也是一种dom,直接用dom操作就可以了。而且你也没做兼容性测试,所以,才说,没啥太大用处 ie only的东西确实没有多大的用处。我一般在开发中能不用xml就不用,因为兼容性处理太麻烦,我一般用json很方便 javascript中 if(!-[1,])什么意思 用jquery实现页面滚动 请高手指导一下:怎么去掉这个警告框? 页面怎样判断是iphone 手机?? 大家好,图片无法显示时,怎么处理才能不显示红叉 改个名字,怎么不行了? ie与firefox兼容的问题!!在线等。。。。。。。。。 在一个JS文件上如何调用其他JS文件中的方法? 怎样规范书写htm、asp文档,使得htm、asp文档转换为js文档不至于出错? javascript 的cursor问题? 各位大侠:html页面打开chm文件问题 js用window.open("http://...")后如何引用新文档
* 返回节点类型,参数:
* @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:'id001',name:'name001'}
* @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('FF创建节点再说.');
return null;
}
},
/**
* 创建带CDATA区段的节点,参数:
* @param {string} nodeName:节点名称,必填
* @param {string} text:节点文本,可为空
* @param {Object} attributes:属性值-JSON数组,可为空,例:{id:'id001',name:'name001'}
* @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('FF创建节点再说.');
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 < childNodes.length; 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 == 'string') return node;
return this.isIE ? node.xml : new XMLSerializer().serializeToString(node);
}
}
[/code]
<?xml version="1.0" encoding="utf-8"?>
<root>
<book>
<name>西游记</name>
<author>吴承恩</author>
</book>
<book>
<name>红楼梦</name>
<author>曹雪芹</author>
</book>
<book>
<name>三国演义</name>
<author>
<name>施耐庵</name>
<sex>男</sex>
</author>
</book>
<book>
<name>水浒传</name>
<author>罗贯中</author>
</book>
</root>[code][code=HTML]
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<mce:script language="JavaScript" type="text/javascript" src="../Ext/ext-base.js" mce_src="Ext/ext-base.js"><!--
// --></mce:script>
<mce:script language="JavaScript" type="text/javascript" src="../Ext/ext-all.js" mce_src="Ext/ext-all.js"><!--
// --></mce:script>
<title>测试xml</title>
<mce:script src="XmlUtils.js" mce_src="XmlUtils.js"></mce:script>
</head>
<body>
<div id='xmlOpTest'></div>
</body>
<mce:script type="text/javascript"><!--
/**
* config参数:xmlPath文件地址;dataType数据格式-json或arry,默认为array。
*/
var xmlUtils = new XmlUtils({xmlPath:"book.xml",dataType:'json'});
alert(xmlUtils.toString());
var rs = xmlUtils.getNodesTextByName(['name','author']);
//把上面的dataType改为array或者不为json此处就能得到值
document.getElementById('xmlOpTest').innerHTML += '<br/>取得所有的文本节点的数组: '+rs + '<br/>';
//这里用了Ext的json解析工具 Ext.encode这个方法是把json对象转换为字符串。Ext.decode则相反,把json格式的字符串转换为json对象数组
document.getElementById('xmlOpTest').innerHTML += '<br/>取得所有的文本节点的JSON数组: '+Ext.encode(rs)+'<br/>';
var root = xmlUtils.getRoot();
xmlUtils.createNode('publish', '中国电力出版社',{id:'id0001'},root);
xmlUtils.createCDATANode('publish', '中国&电力出版社',{},root);
//设置属性
xmlUtils.setAttribute(root,'testId','test');
//修改属性
xmlUtils.setAttribute(root,'testId','test0000000000');
alert(xmlUtils.toString(root));
xmlUtils.removeChild(xmlUtils.getNodesByXpath('//root/publish')[0]);
alert(xmlUtils.toString(root));
node = xmlUtils.getFirstChild();
document.getElementById('xmlOpTest').innerHTML += '<br/>判断是否有子节点: '+xmlUtils.hasChildNodes(node) + ' ------ 判断是否有属性:';//+ xmlUtils.hasAttributes(node) +'<br/>';
document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的第一个节点: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +' ======== 节点类型:' + xmlUtils.getNodeType(node) + '<br/>';
node = xmlUtils.getNextNode(node);
document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的第一个节点下一个节点: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +'<br/>';
node = xmlUtils.getLastChild();
document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的最后一个节点: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +'<br/>';
node = xmlUtils.getPreviousNode(node);
document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的最后一个前一个节点: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node) +'<br/>';
node = xmlUtils.getParentNode(node);
document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的父节点: '+ xmlUtils.toString(node) +'<br/>';
var nodes = xmlUtils.getChildNodes();
document.getElementById('xmlOpTest').innerHTML += '<br/>得到节点的所有子节点: '+xmlUtils.toString(nodes)+'<br/>';
node = xmlUtils.getNodesByXpath('//root/book/name',2);
document.getElementById('xmlOpTest').innerHTML += '<br/>根据xPath得到节点名称和文本值: '+xmlUtils.getTagName(node) + "---" + xmlUtils.getText(node)+'<br/>';
node = xmlUtils.getNodesByXpath('//root/book/author');
document.getElementById('xmlOpTest').innerHTML += '<br/>根据xPath得到节点名称和文本值: '+xmlUtils.getTagName(node[0]) + "---" + xmlUtils.getText(node[0])+'<br/>';
//得到修改后的文本节点
node = xmlUtils.getNodesByXpath('//root/publish',1);
node = xmlUtils.getFirstChild(node);
document.getElementById('xmlOpTest').innerHTML += '<br/>修改文本值前节点文本: '+xmlUtils.getText(node);
xmlUtils.setText(node,"西游记后传");
document.getElementById('xmlOpTest').innerHTML += '-----修改文本值后节点文本: '+xmlUtils.getText(node);
xmlUtils.appendText(node,"之测试");
document.getElementById('xmlOpTest').innerHTML += '-----追加文本值后节点文本: '+xmlUtils.getText(node) + "<br/>";
// --></mce:script>
</html>上面的文件都上传了,下载地址 http://download.csdn.net/source/1708635
而且你也没做兼容性测试,所以,才说,没啥太大用处
我一般在开发中能不用xml就不用,
因为兼容性处理太麻烦,我一般用
json很方便