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

/**
 * Open an XML File and read entire file into a DOM
 * Retrieve all <entry>'s
 * Retrieve each element within each <entry>
 * For every element, retrieve the text content
 * if no agrs[0] --> display entire addrbook XML file 
 * if agrs[0] -----> display only matching last names 
 */

public class addrbookRead
{
    public static void main(String[] args)                                         
    {                                                                     
        Element   root, entry, element;
        Text      text;
        NodeList  entries, nodeList;

	Document doc = null;		

        String    xmlFile = "/home/sultans/web/java/demo/xml/addrbook.xml";

        String    lastname, firstname, street, city, state, zip, phone;

        System.out.println("Lname \t Fname \t Street \t\t City \t\t State \t Phone");
        System.out.println("----- \t ----- \t ------ \t\t ---- \t\t ----- \t -----");

        String searchFor = (args.length > 0) ? args[0].toLowerCase() : "";

	try
	{
	    InputSource input           = new InputSource(xmlFile);

	    DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();			
	    DocumentBuilder DOM         = fact.newDocumentBuilder();
	    doc                         = DOM.parse(input);

	    root  = doc.getDocumentElement();

	    entries = root.getElementsByTagName("entry");

	    for (int i=0; i < entries.getLength(); i++)
	    {			
	        entry = (Element) entries.item(i);			//get ref to an entry

	        nodeList  = entry.getElementsByTagName("lastname");	//get lastname nodes, returns a nodeList
	        element   = (Element) nodeList.item(0);	                //get lastname node
                lastname  = element.getTextContent();			//get text value of this element and children
//	        text      = (Text) element.getFirstChild(); 		//get text node
//	        lastname  = text.getNodeValue();			//get the text value 

	        nodeList  = entry.getElementsByTagName("firstname");	
	        element   = (Element) nodeList.item(0);	                        
	        text      = (Text) element.getFirstChild(); 		
	        firstname = text.getNodeValue();				

	        nodeList  = entry.getElementsByTagName("street");	
	        element   = (Element) nodeList.item(0);	                        
	        text      = (Text) element.getFirstChild(); 		
	        street    = text.getNodeValue();				

	        nodeList  = entry.getElementsByTagName("city");	
	        element   = (Element) nodeList.item(0);	                        
	        text      = (Text) element.getFirstChild(); 		
	        city      = text.getNodeValue();				

	        nodeList  = entry.getElementsByTagName("state");	
	        element   = (Element) nodeList.item(0);	                        
	        text      = (Text) element.getFirstChild(); 		
	        state     = text.getNodeValue();				

	        nodeList  = entry.getElementsByTagName("zip");	
	        element   = (Element) nodeList.item(0);	                        
	        text      = (Text) element.getFirstChild(); 		
	        zip       = text.getNodeValue();				

	        nodeList  = entry.getElementsByTagName("phone");	
	        element   = (Element) nodeList.item(0);	                        
	        text      = (Text) element.getFirstChild(); 		
	        phone     = text.getNodeValue();				

                if (args.length==0 || lastname.toLowerCase().indexOf(searchFor) == 0)
                    System.out.println(lastname +'\t'+ firstname +'\t'+ street +'\t'+ city+'\t' +state +'\t'+ phone);
	    }
	}		
	catch(Exception e)	//catch ParserConfigurationException, SAXException, IOException
	{
	    System.err.println(e);
            e.printStackTrace();
	}
    }
}