javaxmlsaxparserjdom

How to get the values of child nodes in JDOM


I am trying to get a value by parsing an XML document using the JDOM library.

I want to get the values of the driverJar tags, which are child nodes based on the driverJars tag, but I can't get the values.

<connection>
   <driverJars>
      <driverJar>ojdbc11.jar</driverJar>
      <driverJar>orai18n.jar</driverJar>
      <driverJar>test.jar</driverJar>
   </driverJars>
</connection>

I tried:
(It's done until the document is already loaded.)

if (element.getChild(DRIVER_JARS) != null) {
    Element driverJarsElement = element.getChild(DRIVER_JARS);
    List<Element> driverJarElementList = driverJarsElement.getChildren(DRIVER_JAR);
    for (int i = 0; i < driverJarElementList.size(); i++) {
        Element driverJarElement = driverJarElementList.get(i);
        System.out.println(driverJarElement.getText()); // [Element: <driverJar/>]
    }
}

If it is a child, you can get a value, but since it is a child, if you loop through the value, you cannot get the value of children by each index.

What I tried is the value (marked as a comment) that comes out when I print it with System.out.println.

How can I get the value?

What I want to get from the xml above is the String values of ojdbc11.jar, orai18n.jar, and test.jar.

Full code example

 <connection>
    <productId>oracle_10g</productId>
    <productName>Oracle 9i ~ 21c</productName>
    <driverJars>
      <driverJar>ojdbc8.jar</driverJar>
      <driverJar>orai18n.jar</driverJar>
    </driverJars>
 </connection>
String productId = element.getChildTextTrim(PRODUCT_ID); // oracle_10g
String productName = element.getChildTextTrim(PRODUCT_NAME); // Oracle 9i ~ 21c

Element driverJarsElement = element.getChild(DRIVER_JARS);
            List<Element> driverJarElementList = driverJarsElement.getChildren(DRIVER_JAR);

if (element.getChild(DRIVER_JARS) != null) {
  for (int i = 0; i < driverJarElementList.size(); i++) {
     description.setDriverJars(new ArrayList<String (Arrays.asList(driverJarElementList.get(i).toString())));
    }
}

(The reason I wrote that in setDriverJars is because it is a List.)

the code above is (1) After loading the document, insert values into the fields declared in the object description.

(2) And make a copy of the object. (3) Analyze the element and reconstruct the description using the copy. (The method used to reconstruct the description has a different logic from the method in (1).)

In (1), I want to get values from xml, but I can't get values for multiple child nodes.


Solution

  • While the code in your question is not a minimal, reproducible example, the code below is essentially the same. One difference is that in the below code, I first get the root element from the DOM that is created from the XML file.

    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    
    import org.jdom2.Document;
    import org.jdom2.Element;
    import org.jdom2.JDOMException;
    import org.jdom2.input.SAXBuilder;
    
    public class JdomTest {
        private static final String DRIVER_JARS = "driverJars";
        private static final String DRIVER_JAR = "driverJar";
    
        public static void main(String[] args) {
            File xmlFile = new File("connects.xml");
            SAXBuilder saxBuilder = new SAXBuilder();
            try {
                Document doc = saxBuilder.build(xmlFile);
                Element root = doc.getRootElement();
                Element driverJarsElement = root.getChild(DRIVER_JARS);
                List<Element> driverJarElementList = driverJarsElement.getChildren(DRIVER_JAR);
                for (int i = 0; i < driverJarElementList.size(); i++) {
                    Element driverJarElement = driverJarElementList.get(i);
                    System.out.println(driverJarElement.getText());
                }
            }
            catch (JDOMException | IOException x) {
                x.printStackTrace();
            }
        }
    }
    

    Here are the contents of file connects.xml

    <connection>
       <productId>oracle_10g</productId>
       <productName>Oracle 9i ~ 21c</productName>
       <driverJars>
          <driverJar>ojdbc11.jar</driverJar>
          <driverJar>orai18n.jar</driverJar>
       </driverJars>
    </connection>
    

    And here is the output I get when I run the above code:

    ojdbc11.jar
    orai18n.jar
    

    My environment is JDK 17.0.4 on Windows 10 (64 bit) and JDOM 2.0.6