• 使用js函数格式化xml字符串带缩进


    遇到了一个做soap的API的操作,中途需要说明xml的组装模式等,

    如上图,组装产生的mxl代码药格式化并展示.由于是在前端做的,所以需要将字符串将xml进行格式化并输出,找到别人写的算法稍加更改并整理如下:

    //格式化xml代码
    	function formateXml(xmlStr){
    		text = xmlStr;
    		//使用replace去空格
            text = '
    ' + text.replace(/(<w+)(s.*?>)/g,function($0, name, props){
                return name + ' ' + props.replace(/s+(w+=)/g," $1");
            }).replace(/>s*?</g,">
    <");
            //处理注释
            text = text.replace(/
    /g,'
    ').replace(/<!--(.+?)-->/g,function($0, text){
                var ret = '<!--' + escape(text) + '-->';
                return ret;
            }).replace(/
    /g,'
    ');
            //调整格式	以压栈方式递归调整缩进
            var rgx = /
    (<(([^?]).+?)(?: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 == '/');
                var prefix = '';
                if(isBegin == '!'){//!开头
                    prefix = setPrefix(nodeStack.length);
                }else {
                    if(isBegin != '/'){///开头
                        prefix = setPrefix(nodeStack.length);
                        if(!isClosed){//非关闭标签
                            nodeStack.push(name);
                        }
                    }else{
                        nodeStack.pop();//弹栈
                        prefix = setPrefix(nodeStack.length);
                    }
                }
                var ret =  '
    ' + prefix + all;
                return ret;
            });
            var prefixSpace = -1;
            var outputText = output.substring(1);
            //还原注释内容
            outputText = outputText.replace(/
    /g,'
    ').replace(/(s*)<!--(.+?)-->/g,function($0, prefix,  text){
                if(prefix.charAt(0) == '
    ')
                    prefix = prefix.substring(1);
                text = unescape(text).replace(/
    /g,'
    ');
                var ret = '
    ' + prefix + '<!--' + text.replace(/^s*/mg, prefix ) + '-->';
                return ret;
            });
    		outputText=	outputText.replace(/s+$/g,'').replace(/
    /g,'
    ');
    		return outputText;
        }
    	
    	//计算头函数	用来缩进
    	function setPrefix(prefixIndex) {
    		var result = '';
            var span = '    ';//缩进长度
            var output = [];
            for(var i = 0 ; i < prefixIndex; ++i){
                output.push(span);
            }
            result = output.join('');
            return result;
        }
    

      

    以上

  • 相关阅读:
    bsgs整理
    一个数的(勾股数)组
    bzoj4709 柠檬 单调栈,DP,斜率优化
    bzoj 3437 小p的农场
    luoguP4072 [SDOI2016]征途
    结构体/构造函数初始化
    UVA1103 古代象形符号 Ancient Messages 题解
    原创100篇文章祭
    UVA297 四分树 Quadtrees 题解
    stack用法,queue用法,
  • 原文地址:https://www.cnblogs.com/liuyuhangCastle/p/10315032.html
Copyright © 2020-2023  润新知