I am working on a xml processing project. The goal of the project is to take a list of keyterms and descriptions from a document written like so:
<?xml version="1.0" encoding="utf-8"?>
<wordmatch>
    <exercise>
        <key>
        <keyterm>Loop Body</keyterm>
        <decription>is the part of the body that contains the statements to be repeated</decription>
        </key>
        <key>
        <keyterm>Iteration</keyterm>
        <decription>is one time execution of the loop body.</decription>
        </key>
        <key>
        <keyterm>Loop Condition</keyterm>
        <decription>Description</decription>
        </key>
        <key>
        <keyterm>Infinite Loop</keyterm>
        <decription>Description</decription>
        </key>
        <key>
        <keyterm>Sentinel Value</keyterm>
        <decription>Description</decription>
        </key>
        <key>
        <keyterm>Off-by-one</keyterm>
        <decription>is an error in the program that causes the loop body to be executed one more or less time.</decription>
        </key>
        <key>
        <keyterm>Input Redirection</keyterm>
        <decription>is to redirect the output to a data file rather to the console. The file is specified at the command line after the symbol >.</decription>
        </key>
        <!-- <key>
        <keyterm>Output Redirection</keyterm>
        <decription>is to redirect the input from a data file rather from the keyboard. The file is specified at the command line after the symbol <.</decription>
        </key> -->
    </exercise>
    <filename>Section5_2.html</filename>
</wordmatch>
Then process the keyterms and descriptions into respective arrays. I've written the following method for parsing the xml document
private static InputStream readXmlFileIntoInputStream(final String fileName) {
        System.out.println("processing:" + fileName);
        return Main.class.getClassLoader().getResourceAsStream(fileName);
    }
    
    public static Document readXML(String fileName) {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // This is used to prevent xml injection attacks        
        try(InputStream inputStream = new FileInputStream(fileName)){
            dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
            DocumentBuilder db = dbf.newDocumentBuilder();
            doc = db.parse(inputStream);
            doc.getDocumentElement().normalize();
        }
        catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
        }
            return doc;
    }
The method for processing the xml document takes the doc as an argument
public static void processKeyTermsAndDescriptions(Document doc) {
        System.out.println(doc.getDocumentElement().getNodeName());
        
        //TODO: add keyterms to array.
        
        
        //TODO: add descriptions to array.
        
    }
A minimal reproducible example is the following:
private static final String FILENAME = "./src/resources/exercise.xml";
    private static Document doc;
    private static ArrayList<String> keyterms;
    private static ArrayList<String> descriptions;
    
    public static void main(String args[]) {
        System.out.println("Step 1 read xml document");
        Document doc = readXML(FILENAME);
        
        System.out.println("Step 2 for each key add keyterm and description to respective arrays");
        processKeyTermsAndDescriptions(doc);
        
        System.out.println("Step 3 print header");
        String header = printHeader();
        
        System.out.println("Step 4 print body w/ keyterms and descriptions");
        String body = printBodyWithKeyTermsAndDescriptions(keyterms,descriptions);
        
        System.out.println("Step 5 print footer");
        String footer = printFooter(keyterms,descriptions);
        
        System.out.println(header);
        System.out.println(body);
        System.out.println(footer);
        
        // Instantiate the Factory
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    }
I would like to figure out how to loop over the elements in the xml document to process keyterms and descriptions into respective arrays.