xml 字符串 格式化

 公司前端展示的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("    ");
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值