日期:2014-05-16  浏览次数:20507 次

javascript创建xmlDom对象01
xmlDom对象
//--------------------------------xml封装----------------------------------------
/**
 * 新的xml对象方法
 */
var XmlUtil = (function(){
	var useMozDom = document.implementation && document.implementation.createDocument;  //用于判断是否支持火狐浏览器
	
	if (useMozDom) {               //判断是否使用火狐浏览器,IE返回false,火狐返回true
		
		// 给FF Node对象原型添加xml属性    (该Node是火狐浏览器的内置对象)
		Node.prototype.__defineGetter__("xml", function() {
			
		    return new XMLSerializer().serializeToString(this, "text/xml");
		    
		});
		
		// 给FF Node对象原型添加text属性
	    Node.prototype.__defineGetter__("text", function() {
	    	
	        var text = [], childNodes = this.childNodes;
	        
	        for (var i = 0, n; i < childNodes.length; i++) {
	        	n = childNodes[i];
	            text.push(n.hasChildNodes() ? n.text : n.nodeValue);
	        }
	        return text.join();
	    });
	}
	
	return {
		/**
		 * 创建xml对象
		 */
		createXmlDom : useMozDom ? 
			function() {
				return document.implementation.createDocument("", "", null);
			} :
			function() {
				var MSXMLVers = ["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument"];
				for (var i = 0; i < MSXMLVers.length; i++) {
					try {
						return new ActiveXObject(MSXMLVers[i]);
					} catch(e) {}
				}
			},
			
		/**
		 * 加载xml字符串,返回新的XML DOM对象
		 */
		loadXML : useMozDom ?
			function(sXml) {
				// 遗留: DOMParser对象,最初是局部变量,每次都new一个,后来发现firefox3.0会出问题,于是改用全局变量只new一次
		        return new DOMParser().parseFromString(sXml.replace(/\>\s+\</g, "\>\<"), "text/xml");
			} : 
			function(sXml) {
				var doc = this.createXmlDom();
				doc.loadXML(sXml.replace(/\>\s+\</g, "\>\<"));
				return doc;
			},
		/**
		 * 深度复制node节点
		 */
		clone : function(doc, node) {
			// 获得XML DOM对象
			doc = doc.ownerDocument || doc;
			// 获取XML DOM对象根节点
			node = node.documentElement || node;
			
			var root, attrs, nodes, e;
			
			// 创建根节点,设置节点属性
			root = doc.createElement(node.nodeName);
			attrs = node.attributes;
			if (attrs.length > 0) {
				for (var i = 0; i < attrs.length; i++) {
					root.setAttribute(attrs[i].nodeName, attrs[i].nodeValue);
				}
			}
			
			// 添加子节点
			if (node.hasChildNodes()) {
				nodes = node.childNodes;
				for (var i = 0, n; i < nodes.length; i++) {
					n = nodes[i];
					switch (n.nodeType) {
					case 1: // 递归添加元素节点
						e = this.clone(doc, n);
						root.appendChild(e);
						break;
					case 3: // 添加文本节点
						e = doc.createTextNode(n.data);
						root.appendChild(e);
						break;
					case 4: // 添加CDATA节点
						e = doc.createCDATASection(n.data);
						root.appendChild(e);
						break;
					default:
						break;
					}
				}
			}
			return root;
		}
	}
})();

/*******************************************************************************
函数名:    XmlDom
功能:     初始化XMLDOM对象
*******************************************************************************/
function XmlDom()
{   
    //生成DOM对象
    return XmlUtil.createXmlDom();
}

/*******************************************************************************
函数名:    creatRequestNode
功能:     封装的XML的根节点
            输入doc为dom对象 cmd为字符串
            返回结果格式如下:
                <request cmd="RSM_CMD_GET_MEAS_DATA">
                </request>
*******************************************************************************/
function creatRequestNode(doc,cmd)
{
	if(null == doc)
	{
		return null;
	}

    var requestNode = doc.createElement("request");              //创建xml根节点
	if(null != cmd)
	{
		var requestAttribute = doc.createAttribute("cmd");       //创建属性节点cmd
		requestAttribute.value = cmd;                            //为属性节点赋值
		requestNode.setAttributeNode(requestAttribute);          //设置节点属性
	}
	return requestNode;
}

/*******************************************************************************
函数名:    crea