XML格式化函数(JS) + 解析XML文本为Doc函数

来源:互联网 发布:书剑恩仇录 知乎 编辑:程序博客网 时间:2024/06/06 02:21

XML格式化:

String.prototype.removeLineEnd = function() {return this.replace(/(<.+?\s+?)(?:\n\s*?(.+?=".*?"))/g, '$1 $2')}function formatXml(text) {//去掉多余的空格text = '\n' + text.replace(/(<\w+)(\s.*?>)/g, function($0, name, props) {return name + ' ' + props.replace(/\s+(\w+=)/g, " $1");}).replace(/>\s*?</g, ">\n<");//把注释编码text = text.replace(/\n/g, '\r').replace(/<!--(.+?)-->/g,function($0, text) {var ret = '<!--' + escape(text) + '-->';//alert(ret);return ret;}).replace(/\r/g, '\n');//调整格式var rgx = /\n(<(([^\?]).+?)(?:\s|\s*?>|\s*?(\/)>)(?:.*?(?:(?:(\/)>)|(?:<(\/)\2>)))?)/mg;var nodeStack = [];var output = text.replace(rgx, function($0, all, name, isBegin,isCloseFull1, isCloseFull2, isFull1, isFull2) {var isClosed = (isCloseFull1 == '/') || (isCloseFull2 == '/')|| (isFull1 == '/') || (isFull2 == '/');//alert([all,isClosed].join('='));var prefix = '';if (isBegin == '!') {prefix = getPrefix(nodeStack.length);} else {if (isBegin != '/') {prefix = getPrefix(nodeStack.length);if (!isClosed) {nodeStack.push(name);}} else {nodeStack.pop();prefix = getPrefix(nodeStack.length);}}var ret = '\n' + prefix + all;return ret;});var prefixSpace = -1;var outputText = output.substring(1);//alert(outputText);//把注释还原并解码,调格式outputText = outputText.replace(/\n/g, '\r').replace(/(\s*)<!--(.+?)-->/g,function($0, prefix, text) {//alert(['[',prefix,']=',prefix.length].join(''));if (prefix.charAt(0) == '\r')prefix = prefix.substring(1);text = unescape(text).replace(/\r/g, '\n');var ret = '\n' + prefix + '<!--'+ text.replace(/^\s*/mg, prefix) + '-->';//alert(ret);return ret;});return outputText.replace(/\s+$/g, '').replace(/\r/g, '\r\n');}function getPrefix(prefixIndex) {var span = '    ';var output = [];for ( var i = 0; i < prefixIndex; ++i) {output.push(span);}return output.join('');}function btnFormat_click() {var $ = document.getElementById;$('output').value = formatXml($('input').value);}

 

使用:

function showInputLog(obj) {var log = $(obj).parent().find("#input").html();/*log = '<xmp><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" ';log += 'xmlns:web="http://WebXml.com.cn/">';log += '   <soapenv:Header/>';log += '   <soapenv:Body>';log += '      <web:getEnCnTwoWayTranslator>';log += '         <!--Optional:-->';log += '     <web:Word>HELLO</web:Word>';log += '  </web:getEnCnTwoWayTranslator>';log += '   </soapenv:Body>';log += '</soapenv:Envelope></xmp>';*/var s = formatXml(log);$('#show_div_log').html("<xmp>"+s+"</xmp>");$('#win').window('open');}

 

解析XML文本:

    loadXML = function(xmlString){        var xmlDoc=null;        //判断浏览器的类型        //支持IE浏览器         if(!window.DOMParser && window.ActiveXObject){   //window.DOMParser 判断是否是非ie浏览器            var xmlDomVersions = ['MSXML.2.DOMDocument.6.0','MSXML.2.DOMDocument.3.0','Microsoft.XMLDOM'];            for(var i=0;i<xmlDomVersions.length;i++){                try{                    xmlDoc = new ActiveXObject(xmlDomVersions[i]);                    xmlDoc.async = false;                    xmlDoc.loadXML(xmlString); //loadXML方法载入xml字符串                    break;                }catch(e){                }            }        }        //支持Mozilla浏览器        else if(window.DOMParser && document.implementation && document.implementation.createDocument){            try{                /* DOMParser 对象解析 XML 文本并返回一个 XML Document 对象。                 * 要使用 DOMParser,使用不带参数的构造函数来实例化它,然后调用其 parseFromString() 方法                 * parseFromString(text, contentType) 参数text:要解析的 XML 标记 参数contentType文本的内容类型                 * 可能是 "text/xml" 、"application/xml" 或 "application/xhtml+xml" 中的一个。注意,不支持 "text/html"。                 */                domParser = new  DOMParser();                xmlDoc = domParser.parseFromString(xmlString, 'text/xml');            }catch(e){            }        }        else{            return null;        }        return xmlDoc;    }

 使用:

var xmlDoc = loadXML(requestXml);        var root = xmlDoc.documentElement; 

 解析文本后:

buildElementDataMap(root);var TEXT_TYPE = "3";var elementObj = new Object(); //存取XML中解析到的所有值var editObj = new Object();  //设置编辑值,将XML中获取到的新值赋值给对应的可编辑框var paraLenObj = new Object(); //记录各参数个数,给多个Item的属性赋值var xmlCltLenObj = new Object(); //记录Collection或Entity个数,方便解析XML后请求树中添加删除Item/** * 获取Request XML中最新的值 * 获取后返回请求界面可同步 * @param parent */function buildElementDataMap(parent){var elements = parent.childNodes; if(elements && checkHasChildren(elements) > 0){calculateXmlCltLen(parent);for(var i = 0 ; i< elements.length; i++){var tmp = elements[i];var nodeType = tmp.nodeType;var nodeName = tmp.localName;if(nodeType == TEXT_TYPE) continue; //文本节点buildElementDataMap(tmp);}}else{var nodeType = parent.nodeType;if(nodeType != TEXT_TYPE){var nodeName = parent.nodeName;var nodeValue;if(document.all){nodeValue = parent.text;}else{nodeValue = parent.textContent;}if(nodeName.startsWith("msg") || nodeName.startsWith("esb"))nodeName = nodeName.substring(4);if(nodeValue.trim() != ""){markupElementObj(nodeName,nodeValue);}} }}/** * 解析XML,组装请求树中参数值的数据源 * @param nodeName * @param nodeValue */function markupElementObj(nodeName,nodeValue){var tmp = elementObj[nodeName];if(tmp == '' || typeof tmp == 'undefined'){  //各参数第一次进入elementObj[nodeName] = nodeValue;}else{if(tmp instanceof Array){//第N次进入,即第N个Itemtmp[tmp.length] = nodeValue;elementObj[nodeName] = tmp;}else{//第二次进入var tmpArr = [];tmpArr[tmpArr.length] = tmp;tmpArr[tmpArr.length] = nodeValue;elementObj[nodeName] = tmpArr;}}}function checkHasChildren(elements){var isHas = false;for(var i = 0 ; i< elements.length; i++){var tmp = elements[i];var nodeType = tmp.nodeType;if(nodeType != "3"){ //文本节点isHas = true;break;}}return isHas;}

 

 

 

JS解析XML文件和XML字符串

 http://www.cnblogs.com/chjw8016/archive/2011/07/12/2104269.html

 

JS代码在附件。