如何将单行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的嵌套结构、特殊字符(如<、CDATA块)、自闭合标签等场景会让正则表达式变得异常复杂,很容易出现解析错误,维护成本极高。除非你的XML结构极其简单且固定,否则不建议使用。
内容的提问来源于stack exchange,提问作者Maik Hasler
相关产品推荐
相关产品推荐

