How to parse XML & read tag values using JDOM parser?

This blog explains how to read the below xml and also parses the child and the tag value of the given child. I am using Jdom dependency here which you can download from here.

Sample XML File:

For more xml samples you can refer w3schools link.

<?xml version="1.0" encoding="UTF-8" ?>
<breakfast_menu>
   <food>
      <name>Belgian Waffles</name>
      <price>$5.95</price>
      <description>Two of our famous Belgian Waffles with plenty of real maple syrup</description>
      <calories>650</calories>
   </food>
   <food>
      <name>Strawberry Belgian Waffles</name>
      <price>$7.95</price>
      <description>Light Belgian waffles covered with strawberries and whipped cream</description>
      <calories>900</calories>
   </food>
   <food>
      <name>Berry-Berry Belgian Waffles</name>
      <price>$8.95</price>
      <description>Light Belgian waffles covered with an assortment of fresh berries and whipped cream</description>
      <calories>900</calories>
   </food>
   <food>
      <name>French Toast</name>
      <price>$4.50</price>
      <description>Thick slices made from our homemade sourdough bread</description>
      <calories>600</calories>
   </food>
   <food>
      <name>Homestyle Breakfast</name>
      <price>$6.95</price>
      <description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns</description>
      <calories>950</calories>
   </food>
</breakfast_menu>

Parsing the XML using Jdom Parser:

Here I have parsed all the food names presence inside the food tag.

package com.ngdeveloper.parser;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

import java.io.IOException;
import java.io.StringReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;


public class XmlPropertyRead {

    public static void main(String[] args) throws Exception {
        parseXmlUsingJdom();
    }

    public static void parseXmlUsingJdom() throws Exception {
        Path relPath = Paths.get("src", "test", "resources", "my_sample_xml.xml");
        String content = null;
        try {
            content = Files.lines(relPath).collect(Collectors.joining(System.lineSeparator()));
            String xml = content;
            SAXBuilder saxBuilder = new SAXBuilder();
            Document doc = saxBuilder.build(new StringReader(xml));
            Element rootNode = doc.getRootElement();
            List<Element> dataItemsList = rootNode.getChildren("food");
            for (int i = 0; i < dataItemsList.size(); i++) {
                Element dataItem = (Element) dataItemsList.get(i);
                System.out.println(dataItem.getChild("name").getValue());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Output:

Belgian Waffles
Strawberry Belgian Waffles
Berry-Berry Belgian Waffles
French Toast
Homestyle Breakfast

How to get the value based on the xpath given ?

First learn how to create the xpath for the xml elements or attributes here.

Here I am going to get the first food tag name using xpath.

//breakfast_menu/food[1]/name

Code to get the value of the above given xpath:

   public static void getXpathValue(Document document){
        String xPath = "//breakfast_menu/food[1]/name";
        XPathFactory xFactory = XPathFactory.instance();
        XPathExpression<Element> expr = xFactory.compile(xPath, Filters.element());
        Element attribute = expr.evaluateFirst(document);
        if (attribute != null) {
            System.out.println(attribute.getValue());
        } else {
            System.out.println("foobar");
        }
    }

Leave a Reply