公司前端展示的xml太丑了。于是我在后端代码里加了些换行和制表符。
总体思路:
利用<tag>与</tag>的数量差异就能判断出应该每行首部应该留出多少空白格。
/**
* 格式化XML字符串
*/
public static String formatXml(String originStr) {
if (originStr == null) {
return null;
}
char[] charArray = originStr.toCharArray();
int openCount = 0;
int closeCount = 0;
StringBuilder sb = new StringBuilder();
int lastNode = -1;//0 <> 1 </>
for (int i = 0; i < charArray.length; i++) {
// < open and 换行
if (charArray[i] == '<' && i != charArray.length - 1 && charArray[i + 1] != '/' && charArray[i + 1] != '!') {
lastNode = 0;
enterAndTabs(sb, openCount - closeCount);
sb.append(charArray[i]);
openCount++;
continue;
}
// </ close and 换行
if (charArray[i] == '<' && i != charArray.length - 1 && charArray[i + 1] == '/') {
// 0 表示 开-闭 ,不换行
if (lastNode != 0) {
enterAndTabs(sb, openCount - closeCount - 1);
}
sb.append(charArray[i]).append(charArray[++i]);
closeCount++;
lastNode = 1;
continue;
}
// 自闭合
if (charArray[i] == '>' && i > 0 && charArray[i - 1] == '/') {
sb.append(charArray[i]);
closeCount++;
continue;
}
//反着来了
sb.append(charArray[i]);
}
return sb.toString();
}
/**
* 回车与制表符
*
* @param sb StringBuilder
* @param tabCount 多少个制表符
*/
private static void enterAndTabs(StringBuilder sb, int tabCount) {
sb.append("\n");
while (tabCount-- > 0) {
sb.append(" ");
}
}