Giri
Giri

Reputation: 137

How to get an XML id value using Java?

For an XML keyword search project, users may search any value in the XML code:

<?xml version="1.0" encoding="UTF-8"?>
<company>
<staff id="1001">
    <firstname>sachin</firstname>
    <lastname>tendulkar</lastname>
    <nickname>TON</nickname>
    <salary>100000</salary>
</staff>
<staff id="2001">
    <firstname>MS</firstname>
    <lastname>Dhoni</lastname>
    <nickname>MSD</nickname>
    <salary>200000</salary>
</staff>    
<staff id="3001">
    <firstname>yuraj</firstname>
    <lastname>singh</lastname>
    <nickname>yuvi</nickname>
    <salary>200000</salary>
</staff>
</company>

If the user searches for 20000, the result will available in ID 1001 and 2001 so the output should be like:

  ms 
  dhoni
   msd
  200000

  yuraj
 singh
  yuvi
 20000

I would like to do this in Java. Here is what I've written so far:

package a;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

public class TestJava
{

    public static void TestJava(String s) {

        try {

            File fXmlFile = new File("E:/xml/xml/src/a/test.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);


            doc.getDocumentElement().normalize();

            System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

            NodeList nList = doc.getElementsByTagName("staff");

            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;
                    if(eElement.getElementsByTagName("salary").item(0).getTextContent().equals(s))
                    {
                        System.out.println("Staff id : " + eElement.getAttribute("id"));
                        System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
                        System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
                        System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent());
                        System.out.println("Salary : " + eElement.getElementsByTagName("salary").item(0).getTextContent());
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Upvotes: 2

Views: 11290

Answers (2)

Richard JP Le Guen
Richard JP Le Guen

Reputation: 28753

This looks like a job for XPath queries!

    File fXmlFile = new File("test.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(fXmlFile);

    XPathFactory factory = XPathFactory.newInstance();
    XPath xpath = factory.newXPath();

    // This XPath query will give you a list of only those <staff> elements
    // which contain a <salary>200000</salary> element
    XPathExpression expr = xpath.compile("/company/staff/salary[text()=\"200000\"]/..");
    NodeList result = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);

    NodeList nodes = (NodeList) result;
    for (int i = 0; i < nodes.getLength(); i++) {
        Element eElement = (Element) nodes.item(i);
        String id = eElement.getAttribute("id");
        System.out.println("Staff id : " + eElement.getAttribute("id"));
        System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
        System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
        System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent());
        System.out.println("Salary : " + eElement.getElementsByTagName("salary").item(0).getTextContent());
    }

Upvotes: 1

viswanath patimalla
viswanath patimalla

Reputation: 218

This may not be the best and shortest method to do but what you can do is in this way:-

  1. Create a Player class and set firstname,lastname,nickname,salary as variables and generate getters/setters.
  2. Read the xml file and using Jaxb convert your xml to objects. A good link to start off
  3. Now with the objects that you have now search in those object by
    
    object.getActive().compareTo(salary)//compare the player object salary with desires salary in a loop
    

I hope this helps!

Upvotes: 0

Related Questions