我有一个包含XML的Java字符串,没有换行符或缩进.我想把它转换成一个带有格式良好的XML的字符串.我该怎么做?

String unformattedXml = "<tag><nested>hello</nested></tag>";
String formattedXml = new [UnknownClass]().format(unformattedXml);

注:我的输入是String.我的yields 是String.

(基本)模拟结果:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <tag>
    <nested>hello</nested>
  </tag>
</root>

推荐答案

现在是2012年,Java可以做的事情比以前使用XML做的更多,我想在我接受的答案之外添加一个替代选项.除了Java 6之外,它没有任何依赖项.

import org.w3c.dom.Node;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSSerializer;
import org.xml.sax.InputSource;

import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;

/**
 * Pretty-prints xml, supplied as a string.
 * <p/>
 * eg.
 * <code>
 * String formattedXml = new XmlFormatter().format("<tag><nested>hello</nested></tag>");
 * </code>
 */
public class XmlFormatter {

    public String format(String xml) {

        try {
            final InputSource src = new InputSource(new StringReader(xml));
            final Node document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(src).getDocumentElement();
            final Boolean keepDeclaration = Boolean.valueOf(xml.startsWith("<?xml"));

        //May need this: System.setProperty(DOMImplementationRegistry.PROPERTY,"com.sun.org.apache.xerces.internal.dom.DOMImplementationSourceImpl");


            final DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
            final DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
            final LSSerializer writer = impl.createLSSerializer();

            writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE); // Set this to true if the output needs to be beautified.
            writer.getDomConfig().setParameter("xml-declaration", keepDeclaration); // Set this to true if the declaration is needed to be outputted.

            return writer.writeToString(document);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        String unformattedXml =
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?><QueryMessage\n" +
                        "        xmlns=\"http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message\"\n" +
                        "        xmlns:query=\"http://www.SDMX.org/resources/SDMXML/schemas/v2_0/query\">\n" +
                        "    <Query>\n" +
                        "        <query:CategorySchemeWhere>\n" +
                        "   \t\t\t\t\t         <query:AgencyID>ECB\n\n\n\n</query:AgencyID>\n" +
                        "        </query:CategorySchemeWhere>\n" +
                        "    </Query>\n\n\n\n\n" +
                        "</QueryMessage>";

        System.out.println(new XmlFormatter().format(unformattedXml));
    }
}

Java相关问答推荐

如何在运行时动态创建表(使用Java、JPA、SprringBoot)

测试何时使用Mockito强制转换对象会导致ClassCastException

带错误BER验证的itext8签名返回pdf

我如何解释这个错误?必需类型:供应商R,提供:收集器对象,捕获?,java.util.List java.lang.Object>>

Jolt变换JSON数组问题

在JDK 1.8源代码中,为什么使用A-B 0来确定哪个更大,而不是A B?

将Spring Boot 3.2.0升级到3.2.1后查询执行错误

Java中将文本拆分为数字或十进制数字和字符串

GetChildren().emoveAll()不会删除 node

使用Class.this.field=Value初始化构造函数中的最后一个字段会产生错误,而使用this.field=Value则不会

Java泛型类方法的静态返回类型是否被类型擦除?

如何在列表(链表)中插入一个新 node (作为prelast)

如何获得凌空cookies ,并设置它在下一个请求- android

JPA无手术同品种器械可能吗?

如何在Spring Boot中为不同的部署环境管理多个.properties文件?

为什么Instant没有从UTC转换为PostgreSQL的时区?

如何在单元测试中获得我的装饰Mapstruct映射器的实例?

ResponseEntity.控制器截断响应的JSON部分

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

在不带instanceof或switch的java中记录模式