Java HTML / XML How to - Generate an xml file using DOM








Question

We would like to know how to generate an xml file using DOM.

Answer

import java.io.ByteArrayOutputStream;
//from   www.  j a  v a2  s.  c  om
import javax.xml.parsers.DocumentBuilder;
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 org.w3c.dom.Document;
import org.w3c.dom.Element;

public class Main {
  public static void main(String[] args) throws Exception {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    // Create a new document
    Document xmlDoc = builder.newDocument();
    // Create root node for the document...
    Element root = xmlDoc.createElement("Players");
    xmlDoc.appendChild(root);

    // Create a "player" node
    Element player = xmlDoc.createElement("player");
    // Set the players ID attribute
    player.setAttribute("ID", "1");

    // Create currentRank node...
    Element currentRank = xmlDoc.createElement("currentRank");
    currentRank.setTextContent("1");
    player.appendChild(currentRank);

    // Create previousRank node...
    Element previousRank = xmlDoc.createElement("previousRank");
    previousRank.setTextContent("1");
    player.appendChild(previousRank);

    // Create playerName node...
    Element playerName = xmlDoc.createElement("PlayerName");
    playerName.setTextContent("Max");
    player.appendChild(playerName);

    // Create Money node...
    Element money = xmlDoc.createElement("Money");
    money.setTextContent("15");
    player.appendChild(money);

    // Add the player to the root node...
    root.appendChild(player);

    ByteArrayOutputStream baos = null;

    baos = new ByteArrayOutputStream();

    Transformer tf = TransformerFactory.newInstance().newTransformer();
    tf.setOutputProperty(OutputKeys.INDENT, "yes");
    tf.setOutputProperty(OutputKeys.METHOD, "xml");
    tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

    DOMSource domSource = new DOMSource(xmlDoc);
    StreamResult sr = new StreamResult(baos);
    tf.transform(domSource, sr);

    baos.flush();
    System.out.println(new String(baos.toByteArray()));
    baos.close();

  }
}