1

I am trying to parse an XML file to get a "flowchart" step by the step id which is a child element of steps:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CATALOG>
  <FLOWCHART>
    <PRIMARYCODE>FC1</PRIMARYCODE>
    <NAME>Flowchart 1</NAME>
    <STEPS>
      <STEP id="1">was powered on.</STEP>
      <STEP id="2">was not connected with a connection plate.</STEP>
    </STEPS>
  </FLOWCHART>
  <FLOWCHART>
    <PRIMARYCODE>FC2</PRIMARYCODE>
    <NAME>Flowchart2</NAME>
    <STEPS>
      <STEP id="1">was not powered on.</STEP>
      <STEP id="2">was connected with a connection plate.</STEP>
    </STEPS>
  </FLOWCHART>
</CATALOG>

The Java Code that I have thus far will print all the steps and the flowchart code, and flowchart description but how to I request a specific step by an integer value?

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 Flowchart
{
    public static void main(String argv[])
    {
        try
        {
//creating a constructor of file class and parsing an XML file
            File file = new File("src/flowchart.xml");
//an instance of factory that gives a document builder
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//an instance of builder to parse the specified xml file
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(file);
            doc.getDocumentElement().normalize();
            System.out.println("Root element: " + doc.getDocumentElement().getNodeName());
            NodeList nodeList = doc.getElementsByTagName("FLOWCHART");
// nodeList is not iterable, so we are using for loop
            for (int itr = 0; itr < nodeList.getLength(); itr++)
            {
                Node node = nodeList.item(itr);
                System.out.println("\nNode Name: " + node.getNodeName());
                if (node.getNodeType() == Node.ELEMENT_NODE)
                {
                    Element eElement = (Element) node;
                    System.out.println("Flowchart ID: "+ eElement.getElementsByTagName("PRIMARYCODE").item(0).getTextContent());
                    for (int i = 0; i < (eElement.getElementsByTagName("STEPS").getLength() + 1) ; i++)
                    {
                        System.out.println("Steps: "+ eElement.getElementsByTagName("STEP").item(i).getTextContent());
                    }

                }

            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

1 Answer 1

1

For this purpose much more convenient would be usage of XPath API:

import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

public static String getStep(Document doc, String flowchartName, int stepId) throws XPathExpressionException {
        XPathFactory xpf = XPathFactory.newInstance();
        XPathExpression xpath = xpf.newXPath().compile("/CATALOG/FLOWCHART[NAME='" 
                + flowchartName 
                + "']/STEPS/STEP[@id='" 
                + stepId 
                + "']");
        return xpath.evaluate(doc);
    }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.