From caf9476bbb9d3ca3957a053f937bec38c7084c32 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sat, 12 Mar 2022 20:09:18 +0100 Subject: [PATCH] pretty-print xml in java (#11899) * pretty-print xml in java * simplified pom.xml --- pom.xml | 1 + xml-2/.gitignore | 1 + xml-2/README.md | 5 + xml-2/pom.xml | 50 ++++++++++ .../xml/prettyprint/XmlPrettyPrinter.java | 91 +++++++++++++++++++ xml-2/src/main/resources/logback.xml | 13 +++ xml-2/src/main/resources/xml/emails.xml | 4 + xml-2/src/main/resources/xml/prettyprint.xsl | 11 +++ 8 files changed, 176 insertions(+) create mode 100644 xml-2/.gitignore create mode 100644 xml-2/README.md create mode 100644 xml-2/pom.xml create mode 100644 xml-2/src/main/java/com/baeldung/xml/prettyprint/XmlPrettyPrinter.java create mode 100644 xml-2/src/main/resources/logback.xml create mode 100644 xml-2/src/main/resources/xml/emails.xml create mode 100644 xml-2/src/main/resources/xml/prettyprint.xsl diff --git a/pom.xml b/pom.xml index a6202230d4..daaf9db6d2 100644 --- a/pom.xml +++ b/pom.xml @@ -1206,6 +1206,7 @@ wicket wildfly xml + xml-2 xstream diff --git a/xml-2/.gitignore b/xml-2/.gitignore new file mode 100644 index 0000000000..68b918851c --- /dev/null +++ b/xml-2/.gitignore @@ -0,0 +1 @@ +xml/.idea diff --git a/xml-2/README.md b/xml-2/README.md new file mode 100644 index 0000000000..e3c6ed6443 --- /dev/null +++ b/xml-2/README.md @@ -0,0 +1,5 @@ +## XML + +This module contains articles about eXtensible Markup Language (XML) + +### Relevant Articles: \ No newline at end of file diff --git a/xml-2/pom.xml b/xml-2/pom.xml new file mode 100644 index 0000000000..025ad682ad --- /dev/null +++ b/xml-2/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + xml-2 + 0.1-SNAPSHOT + xml-2 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + + org.dom4j + dom4j + ${dom4j.version} + + + + + xml-2 + + + src/main/resources + true + + + + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + + org.apache.maven.plugins + maven-surefire-plugin + + + + + + + 2.1.3 + + + \ No newline at end of file diff --git a/xml-2/src/main/java/com/baeldung/xml/prettyprint/XmlPrettyPrinter.java b/xml-2/src/main/java/com/baeldung/xml/prettyprint/XmlPrettyPrinter.java new file mode 100644 index 0000000000..85fd751325 --- /dev/null +++ b/xml-2/src/main/java/com/baeldung/xml/prettyprint/XmlPrettyPrinter.java @@ -0,0 +1,91 @@ +package com.baeldung.xml.prettyprint; + +import org.dom4j.DocumentHelper; +import org.dom4j.io.OutputFormat; +import org.dom4j.io.XMLWriter; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import java.io.*; + +public class XmlPrettyPrinter { + + public static String prettyPrintByTransformer(String xmlString, int indent, boolean ignoreDeclaration) { + + try { + final InputSource src = new InputSource(new StringReader(xmlString)); + final Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(src); + + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + transformerFactory.setAttribute("indent-number", indent); + Transformer transformer = transformerFactory.newTransformer(new StreamSource(new StringReader(readPrettyPrintXslt()))); + // Using the default transformer will create empty lines in Java9+ +// Transformer transformer = transformerFactory.newTransformer(); + transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, ignoreDeclaration ? "yes" : "no"); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + // Alternatively, we can set indent-size on the transformer object + // transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", String.valueOf(indent)); + Writer out = new StringWriter(); + transformer.transform(new DOMSource(document), new StreamResult(out)); + return out.toString(); + } catch (Exception e) { + throw new RuntimeException("Error occurs when pretty-printing xml:\n" + xmlString, e); + } + } + + + public static String prettyPrintByDom4j(String xmlString, int indent, boolean skipDeclaration) { + try { + final OutputFormat format = OutputFormat.createPrettyPrint(); + format.setEncoding("UTF-8"); + format.setIndentSize(indent); + format.setSuppressDeclaration(skipDeclaration); + + final org.dom4j.Document document = DocumentHelper.parseText(xmlString); + final StringWriter sw = new StringWriter(); + final XMLWriter writer = new XMLWriter(sw, format); + writer.write(document); + return sw.toString(); + } catch (Exception e) { + throw new RuntimeException("Error occurs when pretty-printing xml:\n" + xmlString, e); + } + } + + public static void main(String[] args) throws IOException { + InputStream inputStream = XmlPrettyPrinter.class.getResourceAsStream("/xml/emails.xml"); + String xmlString = readFromInputStream(inputStream); + System.out.println("Pretty printing by Transformer"); + System.out.println("============================================="); + System.out.println(prettyPrintByTransformer(xmlString, 2, true)); + System.out.println("============================================="); + System.out.println("Pretty printing by Dom4j"); + System.out.println("============================================="); + System.out.println(prettyPrintByDom4j(xmlString, 8, false)); + System.out.println("============================================="); + } + + + private static String readPrettyPrintXslt() throws IOException { + InputStream inputStream = XmlPrettyPrinter.class.getResourceAsStream("/xml/prettyprint.xsl"); + return readFromInputStream(inputStream); + } + + private static String readFromInputStream(InputStream inputStream) throws IOException { + StringBuilder resultStringBuilder = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) { + String line; + while ((line = br.readLine()) != null) { + resultStringBuilder.append(line).append("\n"); + } + } + return resultStringBuilder.toString(); + } +} diff --git a/xml-2/src/main/resources/logback.xml b/xml-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/xml-2/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/xml-2/src/main/resources/xml/emails.xml b/xml-2/src/main/resources/xml/emails.xml new file mode 100644 index 0000000000..03338a28fc --- /dev/null +++ b/xml-2/src/main/resources/xml/emails.xml @@ -0,0 +1,4 @@ + Kai Amanda +I am flying to you +Jerry Tom Hey Tom, catch me if you can! + \ No newline at end of file diff --git a/xml-2/src/main/resources/xml/prettyprint.xsl b/xml-2/src/main/resources/xml/prettyprint.xsl new file mode 100644 index 0000000000..3941269f40 --- /dev/null +++ b/xml-2/src/main/resources/xml/prettyprint.xsl @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file