You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将单行XML字符串转换为格式化XML字符串?

解决方案

方案1:使用Java原生XML Transformer API

这是最稳妥的方式,无需额外依赖,能处理任意结构的XML:

import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.StringReader;
import java.io.StringWriter;

public class XmlFormatter {
    public static String formatXml(String unformattedXml) throws TransformerException {
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        // 设置缩进和编码
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

        StreamSource source = new StreamSource(new StringReader(unformattedXml));
        StringWriter writer = new StringWriter();
        StreamResult result = new StreamResult(writer);

        transformer.transform(source, result);
        return writer.toString().trim();
    }

    public static void main(String[] args) throws Exception {
        String rawXml = "<phoneDetails><name>My Phone X</name><displaySize>920x480px</displaySize></phoneDetails>";
        System.out.println(formatXml(rawXml));
    }
}

输出结果会和你期望的一致,自动处理缩进,不管XML元素名称怎么变化都能适配。

方案2:用JacksonXml处理任意XML树

如果你已经引入了Jackson XML依赖,可以直接解析成通用的XML树节点,再格式化输出,不需要绑定实体类:

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.JsonNode;

public class JacksonXmlFormatter {
    public static String formatXml(String unformattedXml) throws Exception {
        XmlMapper xmlMapper = new XmlMapper();
        // 读取XML为通用节点
        JsonNode node = xmlMapper.readTree(unformattedXml);
        // 开启缩进输出
        xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);
        // 输出格式化后的XML
        return xmlMapper.writeValueAsString(node);
    }

    public static void main(String[] args) throws Exception {
        String rawXml = "<phoneDetails><name>My Phone X</name><displaySize>920x480px</displaySize></phoneDetails>";
        System.out.println(formatXml(rawXml));
    }
}

这个方案利用Jackson的树模型处理任意结构XML,同样能解决元素名称不固定的问题。

关于正则表达式的说明

不推荐用正则格式化XML,因为XML的嵌套结构、特殊字符(如&lt;、CDATA块)、自闭合标签等场景会让正则表达式变得异常复杂,很容易出现解析错误,维护成本极高。除非你的XML结构极其简单且固定,否则不建议使用。

内容的提问来源于stack exchange,提问作者Maik Hasler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 02:09:10