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

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();
        }
    }
}

常见问题排查

  1. 确认你的XML结构中SUB-UC标签确实包含TITLE子标签,没有拼写错误(XML标签名区分大小写)
  2. 遍历子节点时一定要加节点类型判断,过滤掉空白文本节点,否则会出现找不到元素的问题
  3. 提取文本后调用trim()方法,可以去掉前后多余的换行、缩进等空白字符,避免存入MongoDB时出现冗余内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:42:02