kkj
kkj

Reputation: 3

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.

Upvotes: 0

Views: 215

Answers (1)

Abra
Abra

Reputation: 20914

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

Upvotes: 0

Related Questions