You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java解析XML父子同名listen-port元素 父节点端口取值异常问题

问题原因

org.w3c.dom.Element的getElementsByTagName方法默认会递归查询当前节点下所有层级的同名子节点,不会仅筛选直接子节点。你的XML结构里<ssl>标签内的<listen-port>节点位置在server直接子节点<listen-port>之前,所以调用eElement.getElementsByTagName("listen-port").item(0)返回的是<ssl>内部的8051端口,而非server层级的8050端口。

解决方法

有两种常用的实现方案:

方案1:筛选server的直接子节点

只遍历server节点的一级子元素,匹配到listen-port就取值,不会扫描嵌套子节点:

// 替换原来获取HttpPort的代码
String HttpPort = null;
NodeList childNodes = eElement.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
    Node child = childNodes.item(i);
    if (child.getNodeType() == Node.ELEMENT_NODE && "listen-port".equals(child.getNodeName())) {
        HttpPort = child.getTextContent();
        break;
    }
}
System.out.println("Http: " + HttpPort);
// 原有获取HttpsPort的逻辑保持不变即可

方案2:使用XPath精准定位

XPath可以直接按路径定位节点,代码更简洁,适合复杂XML结构的解析:

// 先初始化XPath对象
XPath xPath = XPathFactory.newInstance().newXPath();
// 直接定位server下的直接listen-port节点
String HttpPort = xPath.evaluate("./listen-port", eElement);
// 定位ssl下的listen-port节点
String HttpsPort = xPath.evaluate("./ssl/listen-port", eElement);

System.out.println("Http: " + HttpPort);
System.out.println("Https: " + HttpsPort);

该方案不需要写循环遍历逻辑,直接通过路径表达式就能拿到目标值,出错概率更低。

内容的提问来源于stack exchange,提问作者Ron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:36:03