如何使用Javascript正则表达式来格式化XML内容


Posted in Javascript onJuly 04, 2013

使用得是Emeditor ,在看XML文档时,总是因为格式混乱而看不清。这个是一个Emeditor宏来自动格式化XML。下载:formatXml.rar (1,021.00 bytes)
下面这段是这个网页版的javascript格式化XML的代码。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <meta http-equiv=content-type content="text/html; charset=UTF-8">
    <title>Xml格式化工具</title>
    <script type="text/javascript">
    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);
        }
    </script>
    
</head>
<body>
    <textarea id="input" style="width:100%;height:45%;"></textarea>
    <div style="margin:0px auto;"><input type="button" id="btnFormat" onclick="btnFormat_click()" value="格式化" style="width:50%;height:10%;"/></div>
    <textarea id="output" style="width:100%;height:45%;"></textarea>
</body>
</html>
Javascript 相关文章推荐
JavaScript confirm选择判断
Oct 18 Javascript
window.location.hash 使用说明
Nov 08 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
Mar 14 Javascript
你必须知道的JavaScript 变量命名规则详解
May 07 Javascript
getJSON调用后台json数据时函数被调用两次的原因猜想
Sep 29 Javascript
Node.js文件操作详解
Aug 16 Javascript
javascript弹出窗口实现代码
Nov 12 Javascript
Boostrap实现的登录界面实例代码
Oct 09 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
Feb 09 Javascript
axios向后台传递数组作为参数的方法
Aug 11 Javascript
详解微信小程序之一键复制到剪切板
Apr 24 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
Aug 28 Javascript
解析Jquery取得iframe中元素的几种方法
Jul 04 #Javascript
jQuery动态设置form表单的enctype值(实现代码)
Jul 04 #Javascript
浅析jQuery中常用的元素查找方法总结
Jul 04 #Javascript
浅析jQuery对select操作小结(遍历option,操作option)
Jul 04 #Javascript
解析jQuery与其它js(Prototype)库兼容共存
Jul 04 #Javascript
JQuery-tableDnD 拖拽的基本使用介绍
Jul 04 #Javascript
JQuery.Ajax之错误调试帮助信息介绍
Jul 04 #Javascript
You might like
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
九个你必须知道而且又很好用的php函数和特点
2013/08/08 PHP
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
js切换光标示例代码
2013/10/10 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
JavaScript运算符小结
2015/06/03 Javascript
两种方法解决javascript url post 特殊字符转义 + &amp; #
2016/04/13 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
详解微信小程序 页面跳转 传递参数
2016/12/08 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
JavaScript算法教程之sku(库存量单位)详解
2017/06/29 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
使用原生js编写一个简单的框选功能方法
2019/05/13 Javascript
js尾调用优化的实现
2019/05/23 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
2014/07/18 Python
python将ip地址转换成整数的方法
2015/03/17 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
Python学习小技巧之列表项的排序
2017/05/20 Python
python中数据爬虫requests库使用方法详解
2018/02/11 Python
Python中作用域的深入讲解
2018/12/10 Python
python异常触发及自定义异常类解析
2019/08/06 Python
Python进度条的制作代码实例
2019/08/31 Python
Python3 Click模块的使用方法详解
2020/02/12 Python
2013年高中生自我评价
2013/10/23 职场文书
化学学院毕业生自荐信范文
2013/12/17 职场文书
感恩节活动方案
2014/01/27 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
学生自我评语大全
2014/04/18 职场文书
介绍信模板
2015/01/31 职场文书
2015年采购工作总结
2015/04/10 职场文书
水知道答案观后感
2015/06/08 职场文书
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript