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