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
相关产品推荐
相关产品推荐

