如何使用JDOM获取XML中driverJars节点下的driverJar子节点值?
解决JDOM获取XML子节点文本值的问题
问题分析
你遇到的核心问题有两个:
- 调用
getText()却打印出节点对象,大概率是节点名称不匹配(比如常量DRIVER_JAR的字符串值和XML里的driverJar大小写/拼写不一致),导致获取到的是空节点,getText()返回空,打印时输出节点的默认字符串表示。 - 存入
description对象时,错误使用toString()获取节点文本,且每次循环都新建ArrayList,导致最终只保留最后一个节点的错误值。
解决方案
1. 确保节点名称常量匹配XML
首先检查你的常量定义,确保字符串值和XML节点名完全一致:
private static final String DRIVER_JARS = "driverJars"; private static final String DRIVER_JAR = "driverJar";
如果常量是全大写(比如"DRIVER_JAR"),会和XML里的driverJar不匹配,导致getChildren()拿到空列表或空节点。
2. 正确获取节点文本值
使用getText()或getTextTrim()(推荐后者,自动去除文本前后空白字符)获取节点的文本内容,而非toString()(这是输出节点的调试信息)。
3. 修正列表赋值逻辑
不要在循环内每次新建ArrayList,应该先初始化一个列表,逐个添加driverJar的文本值后,再一次性设置到description对象中。
修正后的代码示例
解决打印问题的代码
if (element.getChild(DRIVER_JARS) != null) { Element driverJarsElement = element.getChild(DRIVER_JARS); List<Element> driverJarElementList = driverJarsElement.getChildren(DRIVER_JAR); for (Element driverJarElement : driverJarElementList) { System.out.println(driverJarElement.getTextTrim()); // 输出ojdbc11.jar、orai18n.jar等 } }
解决存入description对象的代码
String productId = element.getChildTextTrim(PRODUCT_ID); String productName = element.getChildTextTrim(PRODUCT_NAME); List<String> driverJarList = new ArrayList<>(); Element driverJarsElement = element.getChild(DRIVER_JARS); if (driverJarsElement != null) { List<Element> driverJarElementList = driverJarsElement.getChildren(DRIVER_JAR); for (Element driverJarElement : driverJarElementList) { driverJarList.add(driverJarElement.getTextTrim()); } } description.setDriverJars(driverJarList);
额外提示
- 如果XML存在命名空间,需要在
getChild()和getChildren()方法中传入命名空间参数,否则会匹配不到节点。 - 单个节点的文本获取可以直接用
getChildTextTrim(),但多子节点场景必须遍历子元素列表。
内容的提问来源于stack exchange,提问作者kkj
相关产品推荐
相关产品推荐

