import javax.xml.parsers.*;
import org.xml.sax.*;
import org.w3c.dom.*;

import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.*;

public class XMLWriter 
{
    public static void main(String args[])
    {
	String XMLinput  = "/home/sultans/web/java/demo/xml/products.xml";
	String XMLoutput = "/home/sultans/web/java/demo/xml/products2.xml";

 	Document doc = readXMLFile(XMLinput);			//Read XML file into DOM object
	boolean done = updateData(doc);				//Traverse DOM and update data 		
	boolean ok   = writeXMLFile(doc, XMLoutput);		//Write XML file into DOM object

	System.out.println((ok)? "Successful" : "Failed");
    }

    static Document readXMLFile(String XMLinput)
    {
	Document doc = null;		
	try
	{
	    InputSource input           = new InputSource(XMLinput);

	    DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();			
	    DocumentBuilder DOM         = fact.newDocumentBuilder();
	    doc                         = DOM.parse(input);
	}		
	catch(Exception e)	//catch ParserConfigurationException, SAXException, IOException
	{
	    System.err.println(e);
	    doc = null;
	}
	finally				//in either case (success or failure)
	{
	    return (doc);
	}	
    }

    static boolean updateData(Document doc)
    {
        Element root  = doc.getDocumentElement();			
		
        Element elem  = doc.createElement("Product");
        Element desc  = doc.createElement("Description"); 
        Text    text1 = doc.createTextNode("This is a new Product"); 
        Element price = doc.createElement("Price"); 
        Text    text2 = doc.createTextNode("15.99"); 

        desc.appendChild(text1);
        price.appendChild(text2);
	
        elem.setAttribute("Code","4567");

        elem.appendChild(desc);
        elem.appendChild(price);

        root.appendChild(elem);

        return(true);
    }

    static boolean writeXMLFile(Document doc, String XMLoutput)
    {
        boolean ok = false;
        try
        {
	    DOMSource    sourceDoc  = new DOMSource(doc);
	    StreamResult outputFile = new StreamResult(XMLoutput); 

	    TransformerFactory fact = TransformerFactory.newInstance();			
	    Transformer t           = fact.newTransformer();
	    t.setOutputProperty(OutputKeys.INDENT, "yes");
	    t.transform(sourceDoc, outputFile);

	    ok = true;			
	}	  		
    	catch(Exception e)	
	{
	    System.err.println(e);
	    ok = false;
	}
	finally				//in either case (success or failure)
	{
	    return (ok);
	}	
    }
}