`

用正则表达式格式化xml代码

    博客分类:
  • 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)
		{
			/*
			 * 功能:去掉多余的空格
			 * 
			 * $0为正则表达式/(<\w+)(\s.*?>)/g匹配到的字符串
			 * name为正则表达式(<\w+)匹配到的字符串
			 * props为正则表达式(\s.*?>)匹配到的字符串
			 */
			text = '\n' + text.replace(/(<\w+)(\s.*?>)/g,function($0, name, props){
				//alert('$0='+$0+', name='+name+', props='+props);
				//alert(name + ' ' + props.replace(/\s+(\w+)/g," $1"));
				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%;">
		<a id="test" name="nn"		><b>b</b><c>c</c></a>
	</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>
分享到:
评论

相关推荐

    正则表达式经典实例

    每个程序员都会遇到需要使用正则表达式的情况,但是要用好正则表达式却并不容易。本书提供了100多个实例,以帮助读者使用正则表达式处理数据和文本。即使有经验的用户也经常会遇到性能不佳、误报、漏报等让人挠头的...

    正则表达式经典实例.pdf

    每个程序员都会遇到需要使用正则表达式的情况,但是要用好正则表达式却并不容易。本书提供了100多个实例,以帮助读者使用正则表达式处理数据和文本。即使有经验的用户也经常会遇到性能不佳、误报、漏报等让人挠头的...

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

    本篇文章是对使用Javascript正则表达式来格式化XML内容的方法进行了详细的分析介绍,需要的朋友可以参考下

    xml_format.rar_javascript_xml格式化

    javascript 正则表达式格式化xml标签缩进。 可用于emeditor插件,或者学习正则表达式。

    regex-parser:用于PCRE正则表达式的AST

    正则表达式解析器 ... 现在,您可以使用格式化程序将AST转换为多种格式(今天仅支持XML): $ formatter = new \ RegexParser \ Parser \ Formatter \ XMLFormatter (); $ xml = $ formatter -&gt; format

    很经典的XML入门教程

    第十二章:格式化XML(一) 第十三章:格式化XML(二) 第十四章:XML 的典型运用(一) 第十五章:XML 的运用(二) 第十六章:XML 的运用(三) 第十七章:如何使用XSL 和正则表达式来验证数据的有效性(一) 第十...

    正则表达式搭配js轻松处理json文本方便而老古

    但是,有一种看起来更方便的老古董——正则表达式,处理json是绰绰有余。 Json(JavaScript Object Notation)作为当今互联网最为一种流行的,超越语言的网络数据交换格式,可以说是“肉多骨少”的一种类型,在网络...

    XML初学入门教程(pdf)

    格式化XML(一) 36 第十三章:格式化XML(二) 38 第十四章:XML的典型运用(一) 52 第十五章:XML的运用(二) 58 第十六章:XML的运用(三) 60 第十七章:如何使用XSL和正则表达式来验证数据的...

    XML学习资料,如何写XML文件

    介绍XML的语法、XML DOM、格式化XML、XML的典型应用以及如何使用XSL和正则表达式来验证数据的有效性的好书。

    C#精髓中文版

    正则表达式 输入/输出 联网 线程 配件 反射 定制属性信息 自动内存管理 同本机dll互操作 与com互操作 第四章 bcl综述 核心类型 文本 集合 流和输入输出 联网 线程 安全 反射 序列化 远程调用 ...

    python正则中最短匹配实现代码

    利用正则表达式解析下面的XML/HTML标签: &lt;composer&gt;Wolfgang Amadeus Mozart &lt;author&gt;Samuel Beckett &lt;city&gt;London&lt;/city&gt; 希望自动格式化重写为: composer: Wolfgang Amadeus Mozart author: Samuel Beckett ...

    华为自动化培训视频.rar

    目录 网盘文件永久链接 01网络自动化概述mp4 02软件版本控制理论mp4 ...33正则表达式mp4 34基于 Python的网络数据包制作实验mp4 35基于 Python的运维告警邮件发送mp4 36NCE业务开放编程理论mp4 37网络人工智能简介mp4

    JavaScript王者归来part.1 总数2

     10.7 用正则表达式处理文本   10.7.1 创建一个计价公式编辑器   10.7.1.1 需求分析--什么是计价公式编辑器   10.7.1.2 系统实现--计价公式编辑器的实现   10.7.2 创建一个同步滚动歌词播放器   10.7.2.1...

    微软.NET Framework开源代码SSCLI

    06、utilcode - 包含被运行时、工具和 C# 编译器使用的核心例程,例如路径处理和分析、数组和散列表管理、C 运行库、字符大小写支持、库和配件载入、调试和日志支持、同步机制,还包括字符串格式化、GUID创建、错误...

    Araxis Merge Professional 2018(包含破解)

    Araxis Merge2018是一款专业的可视化文件比较以及合并和同步的软件,新版带来了全新的功能以及优化,包括合并使您能够比较和处理不同版本的文本文件,如程序源代码,XML和HTML文件。合并可以从Microsoft Office,...

Global site tag (gtag.js) - Google Analytics