Search code examples
javaxmlreader

XML to read get child containing specific value -Java


I'm having trouble to get some particular element, i have an xml file which has root node "problem" which contains children "solutions". In the solutions i have tag name "cost" which has value 505.9208295302417, i want to get all elements in this child containing 505.9208295302417. All that I've done so far is all the nodes i want only this particular child's element not the other. below are the xml and the java code.

      <problem>    
      <solution>
      <cost>505.9214355631349</cost>
                   <routes>
                        <route>
                             <driverId>noDriver</driverId>
                             <vehicleId>1_1</vehicleId>
                             <start>0.0</start>
                             <act type="service">
                                  <serviceId>5 </serviceId>
                                  <arrTime>109.9819741964403</arrTime>
                                  <endTime>119.9819741964403</endTime>
                             </act>
                             <end>229.9639483928806</end>
                        </route>
                        <route>
                             <driverId>noDriver</driverId>
                             <vehicleId>3_1</vehicleId>
                             <start>0.0</start>
                             <act type="service">
                                  <serviceId>2 </serviceId>
                                  <arrTime>109.98268205388193</arrTime>
                                  <endTime>119.98268205388193</endTime>
                             </act>
                             <act type="service">
                                  <serviceId>1 </serviceId>
                                  <arrTime>119.98357684436793</arrTime>
                                  <endTime>129.98357684436792</endTime>
                             </act>
                             <act type="service">
                                  <serviceId>3 </serviceId>
                                  <arrTime>129.98449911991617</arrTime>
                                  <endTime>139.98449911991617</endTime>
                             </act>
                             <act type="service">
                                  <serviceId>4 </serviceId>
                                  <arrTime>139.98539391040217</arrTime>
                                  <endTime>149.98539391040217</endTime>
                             </act>
                             <end>259.9672978232725</end>
                        </route>
                   </routes>
              </solution>
              <solution>
                   <cost>505.9208295302417</cost>
                   <routes>
                        <route>
                             <driverId>noDriver</driverId>
                             <vehicleId>1_1</vehicleId>
                             <start>0.0</start>
                             <act type="service">
                                  <serviceId>5 </serviceId>
                                  <arrTime>109.9819741964403</arrTime>
                                  <endTime>119.9819741964403</endTime>
                             </act>
                             <end>229.9639483928806</end>
                        </route>
                        <route>
                             <driverId>noDriver</driverId>
                             <vehicleId>3_1</vehicleId>
                             <start>0.0</start>
                             <act type="service">
                                  <serviceId>4 </serviceId>
                                  <arrTime>109.98190391287031</arrTime>
                                  <endTime>119.98190391287031</endTime>
                             </act>
                             <act type="service">
                                  <serviceId>2 </serviceId>
                                  <arrTime>119.98282618841856</arrTime>
                                  <endTime>129.98282618841856</endTime>
                             </act>
                             <act type="service">
                                  <serviceId>1 </serviceId>
                                  <arrTime>129.98372097890456</arrTime>
                                  <endTime>139.98372097890456</endTime>
                             </act>
                             <act type="service">
                                  <serviceId>3 </serviceId>
                                  <arrTime>139.9846432544528</arrTime>
                                  <endTime>149.9846432544528</endTime>
                             </act>
                             <end>259.9668316441239</end>
                        </route>
                   </routes>
              </solution>
</problem>

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("route : "
                          // + eElement.getAttribute("id"));
        System.out.println("DriverId : "
                           + eElement.getElementsByTagName("driverId")
                             .item(0).getTextContent());
        System.out.println("vehicleId : "
                           + eElement.getElementsByTagName("vehicleId")
                             .item(0).getTextContent());

                NodeList optionList = eElement.getElementsByTagName("act");
    for (int j = 0; j < optionList.getLength(); ++j)
    {
        Element option = (Element) optionList.item(j);
        for(int k =0;k<1;++k){
        String optionText = option.getTextContent();
       address.add(optionText.replaceAll("[^A-Za-z]"," "));
        System.out.println("Citizen :"+optionText.replaceAll("[^A-Za-z]"," "));}
        ;


    }
             System.out.println("cost : "
                           + eElement.getElementsByTagName("end")
                             .item(0).getTextContent());
    }
}
} catch (Exception e) {
e.printStackTrace();
}

***UPDATE***Here i manage to get what i want, but there is a prob, for the citizen i have only the first "act" tag i need to get all the tags value

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

/**
 *
 * @author HP
 */
public class JavaApplication39 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            int totalVehicle;
            totalVehicle = 2;
            File fXmlFile = new File("C:/Users/HP/Desktop/solution.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);
            doc.getDocumentElement().normalize();
            Double requiredCost = 505.9208295302417;
            System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
            // NodeList nList = doc.getElementsByTagName("route");
            System.out.println("----------------------------");
            NodeList nodeList = doc.getElementsByTagName("solution");
            for (int i = 0; i < nodeList.getLength(); i++) {

                Node solutionNode = nodeList.item(i);

                if (solutionNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element solutionElement = (Element) solutionNode;
                    Node costNode = solutionElement.getElementsByTagName("cost").item(0);
                    Node route = solutionElement.getElementsByTagName("routes").item(0);
                    // if correct cost, proceed to parse further
                    Double costValue = Double.valueOf(costNode.getTextContent());
                    if (Double.compare(requiredCost, costValue) == 0) {
                        System.out.println("working");
                        // there you go, found the node with the cost 505.9208295302417
                        // now just parse all the node elements you need here

                        System.out.println("cost : "
                                + solutionElement.getElementsByTagName("cost")
                                        .item(0).getTextContent());
                        for (int h = 0; h < totalVehicle; h++) {
                            System.out.println("DriverId : "
                                    + solutionElement.getElementsByTagName("driverId")
                                            .item(h).getTextContent().toString());
                            System.out.println("vehicleId : "
                                    + solutionElement.getElementsByTagName("vehicleId")
                                            .item(h).getTextContent());

                            System.out.println("citizen: "
                                    + solutionElement.getElementsByTagName("act")
                                            .item(h).getTextContent());


                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        //System.out.println(address.get(1)); 
    }

}

Solution

  • Is it just me or I don't see any comparison in your code? Checking if node has the cost you need? You can just loop through solution nodes (as you are doing) and once correct cost value found, parse all the elements you need from that node.

    Example code:

    NodeList nodeList = doc.getElementsByTagName("solution");
    Double requiredCost = 505.9208295302417;
    for (int i = 0; i < nodeList.getLength(); i++) {
    
        Node solutionNode = nodeList.item(i);
    
        if (solutionNode.getNodeType() == Node.ELEMENT_NODE) {
            Element solutionElement = (Element) solutionNode;
            Node costNode = solutionElement.getElementsByTagName("cost").item(0);
    
            // if correct cost, proceed to parse further
            Double costValue = Double.valueOf(costNode.getTextContent());
            if (Double.compare(requiredCost, costValue) == 0) {
    
                // there you go, found the node with the cost 505.9208295302417
                // now just parse all the node elements you need here
            }
        }
    }