import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.ProcessingInstruction;
import org.w3c.dom.Attr;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;

import java.io.*;
import java.util.*;


public class GenerateXML
{
    Vector vData;
    Document doc;
    
    public GenerateXML()
    {
        loadData();
    }
    
    private void loadData()
    {
        vData = new Vector();
        //trivial example
        //data is Name$Age$sex
        vData.addElement("John$35$M");
        vData.addElement("Jessie$30$F");
        vData.addElement("Jonathan$28$M");
        vData.addElement("Laila$20$F");
        
    }
    
    public void generate()
    {
        try
        {
            //Create Document
            DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            doc = db.newDocument();
        }
        catch(Exception e)
        {
         
         System.out.println("Error " + e);
            
        }
        
        Element main,root,item;
        
        //the Top element
        main = doc.createElement("Personnel");
        main.appendChild(doc.createTextNode("\n"));
        
        String name = "";
        String age  = "";
        String sex  = "";        
        for(int i = 0 ; i < vData.size(); i++)
        {
            //extract data from the vector
            String data = (String)vData.elementAt(i);
            StringTokenizer st = new StringTokenizer(data,"$");
            
            //should check whether there is data not implemented            
            
            name = st.nextToken();
            age =  st.nextToken();
            sex =  st.nextToken();
            
            root = doc.createElement("Employee");
            root.appendChild(doc.createTextNode("\n"));
            
            //add name Element
            item = doc.createElement("Name");
            item.appendChild(doc.createTextNode(name));
            root.appendChild(item);
            root.appendChild(doc.createTextNode("\n"));
            
            //add Age Element
            item = doc.createElement("Age");
            item.appendChild(doc.createTextNode(age));
            root.appendChild(item);
            root.appendChild(doc.createTextNode("\n"));
            
            //add Sex Element
            item = doc.createElement("Sex");
            item.appendChild(doc.createTextNode(sex));
            root.appendChild(item);
            root.appendChild(doc.createTextNode("\n"));
            
            //add to the Top Element
            main.appendChild(root);
            main.appendChild(doc.createTextNode("\n"));
        }//end of for
        
        doc.appendChild(main);
    
    }//end of generate
    
    //walk the DOM tree and print as u go
    private void walk(Node node)
    {
        int type = node.getNodeType();
        switch(type)
        {
            case Node.DOCUMENT_NODE:
            {
              System.out.println("<?xml version=\"1.0\" encoding=\""+
                                "UTF-8" + "\"?>");  
              break;                  
            }//end of document
            case Node.ELEMENT_NODE:
            {
                System.out.print('<' + node.getNodeName() );
                NamedNodeMap nnm = node.getAttributes();
                if(nnm != null )
                {
                    int len = nnm.getLength() ;
                    Attr attr;
                    for ( int i = 0; i < len; i++ )
                    {
                        attr = (Attr)nnm.item(i);
                        System.out.print(' ' 
                             + attr.getNodeName()
                             + "=\""
                             + attr.getNodeValue()
                             +  '"' );
                    }
                }
                System.out.print('>');
                
                break;
                
            }//end of element
            case Node.ENTITY_REFERENCE_NODE:
            {
               
               System.out.print('&' + node.getNodeName() + ';' );
               break;
                
            }//end of entity
            case Node.CDATA_SECTION_NODE:
            {
                    System.out.print( "<![CDATA[" 
                            + node.getNodeValue()
                            + "]]>" );
                     break;       
                
            }
            case Node.TEXT_NODE:
            {
                System.out.print(node.getNodeValue());
                break;
            }
            case Node.PROCESSING_INSTRUCTION_NODE:
            {
                System.out.print("<?" 
                    + node.getNodeName() ) ;
                String data = node.getNodeValue();
                if ( data != null && data.length() > 0 ) {
                    System.out.print(' ');
                    System.out.print(data);
                }
                System.out.println("?>");
                break;

             }
        }//end of switch
        
              
        //recurse
        for(Node child = node.getFirstChild(); child != null; child = child.getNextSibling())
        {
            walk(child);
        }
        
        //without this the ending tags will miss
        if ( type == Node.ELEMENT_NODE )
        {
            System.out.print("</" + node.getNodeName() + ">");
        }
        

        
    }//end of walk
    public void print()
    {
        walk(doc);
    }
    public static void main(String args[])
    {
      
      GenerateXML gxml  = new GenerateXML();
      gxml.generate();
      gxml.print();
      
    }//end of main
    
}//end of generateXML