JS格式化XML 发表于 2021-10-30 | 分类于 js JS格式化XML 格式化XML123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263String.prototype.removeLineEnd = function () { return this.replace(/(<.+?\s+?)(?:\n\s*?(.+?=".*?"))/g, '$1 $2')}function getPrefix(prefixIndex) { var span = ' '; var output = []; for (var i = 0; i < prefixIndex; ++i) { output.push(span); } return output.join('');}var format_xml_fun = function (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) { return '<!--' + escape(text) + '-->'; }).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 === '/'); 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); } } return '\n' + prefix + all; }); var prefixSpace = -1; var outputText = output.substring(1); //把注释还原并解码,调格式 outputText = outputText.replace(/\n/g, '\r').replace(/(\s*)<!--(.+?)-->/g, function ($0, prefix, text) { if (prefix.charAt(0) === '\r') prefix = prefix.substring(1); text = unescape(text).replace(/\r/g, '\n'); return '\n' + prefix + '<!--' + text.replace(/^\s*/mg, prefix) + '-->'; }); return outputText.replace(/\s+$/g, '').replace(/\r/g, '\r\n');}export const format_xml = format_xml_fun