Java 格式化 XML

项目中会有XML报文,格式化后便于查看

import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;

/**
 * @ClassName: XmlUtils
 * @Description: XmlUtils
 * @Author: pangning@58.com
 * @Date: 2019/7/25 15:29
 * @Version: 1.0
 **/
public final class XmlUtils {
    public static String format(String unformattedXml) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            InputSource is = new InputSource(new StringReader(unformattedXml));
            final Document document = db.parse(is);
            OutputFormat format = new OutputFormat(document);
            format.setLineWidth(65);
            format.setIndenting(true);
            format.setIndent(2);
            Writer out = new StringWriter();
            XMLSerializer serializer = new XMLSerializer(out, format);
            serializer.serialize(document);
            return out.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个Java格式化XML的工具,同时会区分注释: ```java import java.util.Stack; public class XmlFormatter { private static final String INDENT = " "; public static String format(String xml) { StringBuilder result = new StringBuilder(); Stack<String> stack = new Stack<>(); int level = 0; boolean inTag = false; boolean inComment = false; boolean inCDATA = false; boolean inProcessingInstruction = false; boolean inAttributeValue = false; char currentQuote = '"'; boolean inEntity = false; StringBuilder currentWord = new StringBuilder(); for (int i = 0; i < xml.length(); i++) { char c = xml.charAt(i); if (inComment) { currentWord.append(c); if (currentWord.toString().endsWith("*/")) { result.append(currentWord); currentWord = new StringBuilder(); inComment = false; } } else if (inCDATA) { currentWord.append(c); if (currentWord.toString().endsWith("]]>")) { result.append(currentWord); currentWord = new StringBuilder(); inCDATA = false; } } else if (inProcessingInstruction) { currentWord.append(c); if (c == '?' && currentWord.toString().endsWith("?>")) { result.append(currentWord); currentWord = new StringBuilder(); inProcessingInstruction = false; inTag = false; } } else if (inAttributeValue) { currentWord.append(c); if (c == currentQuote) { result.append(currentWord); currentWord = new StringBuilder(); inAttributeValue = false; } } else if (inEntity) { currentWord.append(c); if (c == ';') { result.append(currentWord); currentWord = new StringBuilder(); inEntity = false; } } else if (inTag) { if (c == '>') { currentWord.append(c); result.append(currentWord); if (currentWord.toString().startsWith("</")) { level--; } else if (!currentWord.toString().startsWith("<?")) { stack.push(currentWord.toString()); level++; } currentWord = new StringBuilder(); inTag = false; } else if (c == '"' || c == '\'') { currentWord.append(c); inAttributeValue = true; currentQuote = c; } else { currentWord.append(c); } } else if (c == '<') { if (currentWord.length() > 0) { result.append(indent(level) + currentWord); currentWord = new StringBuilder(); } currentWord.append(c); inTag = true; if (xml.charAt(i + 1) == '?') { inProcessingInstruction = true; } else if (xml.charAt(i + 1) == '!') { if (xml.charAt(i + 2) == '-' && xml.charAt(i + 3) == '-') { inComment = true; } else if (xml.charAt(i + 2) == '[' && xml.charAt(i + 3) == 'C' && xml.charAt(i + 4) == 'D' && xml.charAt(i + 5) == 'A' && xml.charAt(i + 6) == 'T' && xml.charAt(i + 7) == 'A' && xml.charAt(i + 8) == '[') { inCDATA = true; } } } else { currentWord.append(c); if (c == '&') { inEntity = true; } } } return result.toString(); } private static String indent(int level) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < level; i++) { sb.append(INDENT); } return sb.toString(); } } ``` 使用方法: ```java String xml = "<xml><foo>bar</foo><!-- this is a comment --></xml>"; String formattedXml = XmlFormatter.format(xml); System.out.println(formattedXml); ``` 输出结果: ``` <xml> <foo> bar </foo> <!-- this is a comment --> </xml> ``` 其中,注释会被识别为 `<!-- ... -->` 的格式,并在格式化后保留其原有位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值