Hi I am new to XML and my professor never taught me XML and yet I have this assignment where I have to create, essentially, an address book using java and saving/updating it into an xml file.
This is my code so far
import java.io.*;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.util.*;
public class Contact
{
contactInfo contact = new contactInfo();
Scanner kbd = new Scanner (System.in);
public Contact()
{
try
{
String filepath = "c:\\Users\\T\\Eclipse Workspace\\ContactInfo\\nData.xml";
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(filepath);
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
private int menu()
{
String instring = "";
do
{
System.out.println ("\n\n***welcome to the Contact Directory: \n\n" +
"menu.......\n" +
"1: Add Contact\n" +
"2: Delete Contact\n" +
"3: Update Contact\n" +
"4: Search for Cotnact\n\n" +
"enter your choice: ");
instring = kbd.nextLine ( );
if ((!instring.equals ("1")) && (!instring.equals ("2")) && (!instring.equals ("3"))
&& (!instring.equals ("4")))
System.out.println ("illegal input");
else
break;
} while (true);
return Integer.parseInt (instring);
}
public void arrival ( ) throws ParserConfigurationException, SAXException, IOException, TransformerException, XPathExpressionException
{
int choice = menu ( );
switch (choice)
{
case 1: add ( ); break;
case 2: delete ( ); break;
case 3: update ( ); break;
case 4: search ( ); break;
}
}
public void add() throws ParserConfigurationException, SAXException, IOException, TransformerException
{
System.out.println("\nAdding New Contact");
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse("nData.xml");
Element root = document.getDocumentElement();
// Root Element
Element rootElement = document.getDocumentElement();
Collection<Server> svr = new ArrayList<Server>();
svr.add(new Server());
for (Server i : svr)
{
// server elements
Element server = document.createElement("contact");
rootElement.appendChild(server);
Element name = document.createElement("name");
name.appendChild(document.createTextNode(i.getName()));
server.appendChild(name);
Element address1 = document.createElement("primary_address");
address1.appendChild(document.createTextNode(i.getAddress1()));
server.appendChild(address1);
Element address2 = document.createElement("secondary_address");
address2.appendChild(document.createTextNode(i.getAddress2()));
server.appendChild(address2);
Element phone1 = document.createElement("primary_phone");
phone1.appendChild(document.createTextNode(i.getPhone1()));
server.appendChild(phone1);
Element phone2 = document.createElement("backup_phone1");
phone1.appendChild(document.createTextNode(i.getPhone2()));
server.appendChild(phone2);
Element phone3 = document.createElement("backup_phone2");
phone3.appendChild(document.createTextNode(i.getPhone3()));
server.appendChild(phone3);
Element group1 = document.createElement("group1");
group1.appendChild(document.createTextNode(i.getGroup1()));
server.appendChild(group1);
Element group2 = document.createElement("group2");
group2.appendChild(document.createTextNode(i.getGroup2()));
server.appendChild(group2);
root.appendChild(server);
}
DOMSource source = new DOMSource(document);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
StreamResult result = new StreamResult("nData.xml");
transformer.transform(source, result);
System.out.println("Done");
}
public class Server
{
public String getName()
{
System.out.println("Please Enter name");
String name = kbd.nextLine();
return name;
}
public String getAddress1()
{
System.out.println("Please enter Primary Address: ");
String address1 = kbd.nextLine();
return address1;
}
public String getAddress2()
{
System.out.println("Please enter Secondary Address (if none, press ENTER): ");
String address2 = kbd.nextLine();
return address2;
}
public String getPhone1()
{
System.out.println("Please enter Primary Phone Number: ");
String phone1 = kbd.nextLine();
return phone1;
}
public String getPhone2()
{
System.out.println("Please enter First Backup Phone Number (if none, press ENTER): ");
String phone2 = kbd.nextLine();
return phone2;
}
public String getPhone3()
{
System.out.println("Please enter Second Backup Phone Number (if none, press ENTER: ");
String phone3 = kbd.nextLine();
return phone3;
}
public String getGroup1()
{
System.out.println("Please enter Group (if none, press ENTER: ");
String group1 = kbd.nextLine();
return group1;
}
public String getGroup2()
{
System.out.println("Please enter Group (if none, Press ENTER: ");
String group2 = kbd.nextLine();
return group2;
}
}
public void delete()
{
System.out.println("\nDeleting Contact");
}
public void update()
{
System.out.println("\nUpdating Contact");
}
public void search() throws SAXException, IOException, ParserConfigurationException, XPathExpressionException
{
System.out.println("\nSearch for Contact");
int choice = searchMenu ( );
switch (choice)
{
case 1:
try
{
File fXmlFile = new File("/Users/T/Eclipse Workspace/contactInfo/nData.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
System.out.println("Contact Information");
NodeList nList = doc.getElementsByTagName("contact");
System.out.println("----------------------------");
for (int temp = 0; temp < nList.getLength(); temp++)
{
Node nNode = nList.item(temp);
System.out.println("\nCurrent Element :" + nNode.getNodeName());
System.out.println("Please enter Name of Contact: ");
String input = kbd.nextLine();
if (nNode.getNodeType() == Node.ELEMENT_NODE)
{
Element eElement = (Element) nNode;
if (input == eElement.getElementsByTagName("name").item(0).getTextContent())
{
System.out.println("Name : " + eElement.getElementsByTagName("name").item(0).getTextContent());
System.out.println("Primary Address : " + eElement.getElementsByTagName("primary_address").item(0).getTextContent());
System.out.println("Secondary Address : " + eElement.getElementsByTagName("secondary_address").item(0).getTextContent());
System.out.println("Primary Phone : " + eElement.getElementsByTagName("primary_phone").item(0).getTextContent());
System.out.println("Backup Phone1 : " + eElement.getElementsByTagName("backup_phone1").item(0).getTextContent());
System.out.println("Backup Phone2 : " + eElement.getElementsByTagName("backup_phone2").item(0).getTextContent());
System.out.println("Group : " + eElement.getElementsByTagName("group1").item(0).getTextContent());
System.out.println("Group : " + eElement.getElementsByTagName("group2").item(0).getTextContent());
break;
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
break;
//case 2: address ( ); break;
//case 3: email ( ); break;
//case 4: phone ( ); break;
//case 5: break;
//case 6: exit (); break;
}
}
private int searchMenu ( )
{
String instring = "";
do
{
System.out.print ("search by: \n\n" +
"1: Name(first and last)\n" +
"2: Address\n" +
"3: E-mail\n" +
"4: Phone Number\n" +
"5: Group\n" +
"6: Exit\n\n" +
"Enter your choice: ");
instring = kbd.nextLine ( );
if ((!instring.equals ("1")) && (!instring.equals ("2")) && (!instring.equals ("3"))
&& (!instring.equals ("4")) && (!instring.equals ("5"))&&(!instring.equals("6")))
System.out.println ("illegal input");
else
break;
} while (true);
return Integer.parseInt (instring);
}
}
Constructors and other stuff that i need
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class contactInfo
{
String name;
String address;
int phone;
String group;
public String getName()
{
return name;
}
@XmlElement
public void setName(String name)
{
this.name = name;
}
public String getAddress()
{
return address;
}
@XmlElement
public void setAddress(String address)
{
this.address = address;
}
public int getPhone()
{
return phone;
}
@XmlElement
public void setPhone(int phone)
{
this.phone = phone;
}
public String getGroup()
{
return group;
}
@XmlElement
public void setGroup(String group)
{
this.group = group;
}
}
My main class
import java.util.Random;
import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import java.util.Scanner;
public class MainClass
{
public static void main (String [ ] args)
{
Contact myContact = new Contact();
Random gen = new Random ( );
try
{
File fXmlFile = new File("/Users/T/Eclipse Workspace/contactInfo/nData.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
//optional, but recommended
//read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
doc.getDocumentElement().normalize();
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("contact");
System.out.println("----------------------------");
for (int temp = 0; temp < nList.getLength(); temp++)
{
Node nNode = nList.item(temp);
System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE)
{
Element eElement = (Element) nNode;
System.out.println("Name : " + eElement.getElementsByTagName("name").item(0).getTextContent());
System.out.println("Address : " + eElement.getElementsByTagName("address").item(0).getTextContent());
System.out.println("Phone : " + eElement.getElementsByTagName("phone").item(0).getTextContent());
System.out.println("Group : " + eElement.getElementsByTagName("group").item(0).getTextContent());
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
try
{
String filepath = "c:\\Users\\T\\Eclipse Workspace\\ContactInfo\\nData.xml";
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(filepath);
int what = 0;
do
{
what = gen.nextInt (20);
if (what % 1 == 0)
myContact.arrival ( );
else if (what == 17)
break;
} while (true);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(filepath));
transformer.transform(source, result);
System.out.println("Done");
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
My XML file looks like this
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<contactInfo>
<contact>
<name>tim</name>
<primary_address>1111 virginia road</primary_address>
<secondary_address>N/A</secondary_address>
<primary_phone>703-111-1111</primary_phone>
<backup_phone1>N/A</backup_phone1>
<backup_phone2>N/A</backup_phone2>
<group1>family</group1>
<group2>friends</group2>
</contact>
<contact>
<name>john</name>
<primary_address>1111 pike road</primary_address>
<secondary_address>N/A</secondary_address>
<primary_phone>222-222-2222</primary_phone>
<backup_phone1>N/A</backup_phone1>
<backup_phone2>N/A</backup_phone2>
<group1>friends</group1>
<group2>N/A</group2>
</contact>
</contactInfo>
I want to be able to search for name, like tim, using a Scanner and then using that name, display all the information on that goes along with that name. for instance if john was typed into the scanner, then john's address, phone, and group with come up.
Vice Versa with address, group, and phone
Recently updated my code and xml file