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

  使用得是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>