Home > Software design >  String to xml elements in java
String to xml elements in java

Time:05-20

I'm working on a project in java but I need to create and xml from a list of Strings on this way:
1: "/data/user/firstname/John"
2: "/data/user/middlename/F"
3: "/data/user/lastname/Thomas"

and the expected result should be this one:

<data>
  <user>
    <firstname>John</firstname>
    <middlename>F</middlename>
    <lastname>Thomas</lastname>
  </user>
<data>

does anyone know if it possible in java? Thank you!

CodePudding user response:

Working example with plain Java, without frameworks:

package test;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.util.Arrays;

public class Test {

    public static void main(String[] args) throws ParserConfigurationException, TransformerException {

        DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
        Document document = documentBuilder.newDocument();

        String a = "/data/user/firstname/John";
        String b = "/data/user/middlename/F";
        String c = "/data/user/lastname/Thomas";

        // Create arrays from string and trim first empty space before first '/'
        String [] arrayA = Arrays.copyOfRange(a.split("/"), 1, a.split("/").length);
        String [] arrayB = Arrays.copyOfRange(b.split("/"), 1, b.split("/").length);
        String [] arrayC = Arrays.copyOfRange(c.split("/"), 1, c.split("/").length);

        Element parent = null;
        for (int i = 0; i < arrayA.length; i  ) {

            // Append text to child nodes, do it at very end
            if (i == arrayA.length - 1) {
                Element element1 = (Element) document.getElementsByTagName(arrayA[i - 1]).item(0);
                element1.appendChild(document.createTextNode(arrayA[i]));
                Element element2 = (Element) document.getElementsByTagName(arrayB[i - 1]).item(0);
                element2.appendChild(document.createTextNode(arrayB[i]));
                Element element3 = (Element) document.getElementsByTagName(arrayC[i - 1]).item(0);
                element3.appendChild(document.createTextNode(arrayC[i]));
                break;
            }

            // if names are same, appending only one of them
            if ((arrayA[i].equals(arrayB[i])) && (arrayA[i].equals(arrayC[i]))) {
                System.out.println("true");
                // create root node
                if (i == 0) {
                    Element element = document.createElement(arrayA[i]);
                    document.appendChild(element);
                    parent = element;
                    System.out.println(document.toString());
                } else {
                    Element element = document.createElement(arrayA[i]);
                    parent.appendChild(element);
                    parent = element;
                    System.out.println(document.toString());
                }
            // if node names at same levels are different, add all of them
            } else {
                System.out.println("false");
                Element element1 = document.createElement(arrayA[i]);
                Element element2 = document.createElement(arrayB[i]);
                Element element3 = document.createElement(arrayC[i]);
                parent.appendChild(element1);
                parent.appendChild(element2);
                parent.appendChild(element3);
            }
        }

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource domSource = new DOMSource(document);
        StreamResult streamResult = new StreamResult(new File("result.xml"));
        transformer.transform(domSource, streamResult);
    }
}

Output of this program:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><data><user><firstname>John</firstname><middlename>F</middlename><lastname>Thomas</lastname></user></data>

Or, write it to file, then, to last lines need to be:

    StreamResult streamResult = new StreamResult(new File("result.xml"));
    transformer.transform(domSource, streamResult);
  • Related