Java中如何优先获取XML的UC-GRP下TITLE内容,不存在时取SUB-UC下TITLE
问题场景
你需要从XML文件的UC-GRP标签中提取标题文本,规则如下:
- 若
UC-GRP直接包含TITLE子标签,直接取该标签的文本内容 - 若
UC-GRP没有直接的TITLE子标签(仅包含SUB-UC子标签),则取SUB-UC下的TITLE标签文本内容
当前使用Java DOM解析时无法获取SUB-UC的子元素内容。
解决方案
核心注意点
Java DOM的getElementsByTagName方法是递归查找所有后代节点,如果你直接用该方法从UC-GRP节点查询TITLE,会直接命中SUB-UC下的TITLE,导致你的判断逻辑失效。另外DOM会把XML中的换行、缩进等空白内容解析为文本节点,遍历子节点时需要先过滤掉非元素类型的节点。
可行代码示例
import org.w3c.dom.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; public class XmlParseService { public static void main(String[] args) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 关闭外部DTD校验,避免解析慢或者校验失败 factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); DocumentBuilder builder = factory.newDocumentBuilder(); // 替换为你的XML文件路径 Document doc = builder.parse(new File("test.xml")); doc.getDocumentElement().normalize(); // 获取所有UC-GRP节点 NodeList ucGrpNodes = doc.getElementsByTagName("UC-GRP"); for (int i = 0; i < ucGrpNodes.getLength(); i++) { Node ucGrpNode = ucGrpNodes.item(i); if (ucGrpNode.getNodeType() != Node.ELEMENT_NODE) { continue; } Element ucGrpElem = (Element) ucGrpNode; String title = null; // 第一步:遍历直接子节点,查找有没有直接的TITLE标签 NodeList children = ucGrpElem.getChildNodes(); for (int j = 0; j < children.getLength(); j++) { Node child = children.item(j); if (child.getNodeType() == Node.ELEMENT_NODE && "TITLE".equals(child.getNodeName())) { title = child.getTextContent().trim(); break; } } // 第二步:没找到直接TITLE,查找SUB-UC下的TITLE if (title == null) { NodeList subUcNodes = ucGrpElem.getElementsByTagName("SUB-UC"); if (subUcNodes.getLength() > 0) { Element subUcElem = (Element) subUcNodes.item(0); NodeList subTitleNodes = subUcElem.getElementsByTagName("TITLE"); if (subTitleNodes.getLength() > 0) { title = subTitleNodes.item(0).getTextContent().trim(); } } } // 这里替换为你插入MongoDB的逻辑 System.out.println("提取到的标题:" + title); } } catch (Exception e) { e.printStackTrace(); } } }
常见问题排查
- 确认你的XML结构中
SUB-UC标签确实包含TITLE子标签,没有拼写错误(XML标签名区分大小写) - 遍历子节点时一定要加节点类型判断,过滤掉空白文本节点,否则会出现找不到元素的问题
- 提取文本后调用
trim()方法,可以去掉前后多余的换行、缩进等空白字符,避免存入MongoDB时出现冗余内容
内容的提问来源于stack exchange,提问作者user2010885
相关产品推荐
相关产品推荐

