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

Spring解析XML时如何提取akaList内别名数据写入对应表列

实现方案

核心思路

Element.getElementsByTagName()方法会递归查找当前节点下所有层级的同名标签,所以你直接从Entry根节点调用该方法会同时命中Entry自身、akaList下的firstName/lastName。要区分两类字段,只需要先定位到akaList子节点,再在该节点的范围内提取别名相关的姓名字段即可。

可直接复用的修改后代码

@Override
public void parseSnFile(String fileName) {    
    //... 省略原有逻辑
    try {
        //... 省略XML加载逻辑
        NodeList entryList = doc.getElementsByTagName("Entry");
        List<MyEntity> entityList = new ArrayList<>();

        for (int temp = 0; temp < entryList.getLength(); temp++) {
            Node entryNode = entryList.item(temp);
            if (entryNode.getNodeType() != Node.ELEMENT_NODE) {
                continue;
            }
            Element entryElement = (Element) entryNode;
            // 提取Entry根节点的基础字段
            String uid = entryElement.getElementsByTagName("uid").item(0).getTextContent();
            String rootLastName = entryElement.getElementsByTagName("lastName").item(0).getTextContent();
            String rootFirstName = entryElement.getElementsByTagName("firstName").item(0).getTextContent();
            String fullName = rootFirstName + " " + rootLastName;
            String sdnType = entryElement.getElementsByTagName("sdnType").item(0).getTextContent();

            // 提取akaList下的别名
            StringBuilder aliasSb = new StringBuilder();
            NodeList akaListNodes = entryElement.getElementsByTagName("akaList");
            if (akaListNodes.getLength() > 0) {
                Element akaListElement = (Element) akaListNodes.item(0);
                NodeList akaNodes = akaListElement.getElementsByTagName("aka");
                for (int i = 0; i < akaNodes.getLength(); i++) {
                    Element akaElement = (Element) akaNodes.item(i);
                    String aliasLastName = akaElement.getElementsByTagName("lastName").item(0).getTextContent();
                    String aliasFirstName = akaElement.getElementsByTagName("firstName").item(0).getTextContent();
                    if (aliasSb.length() > 0) {
                        aliasSb.append(",");
                    }
                    aliasSb.append(aliasFirstName).append(" ").append(aliasLastName);
                }
            }
            String alias = aliasSb.toString();

            // 组装实体存库
            MyEntity entity = new MyEntity();
            entity.setUid(Long.parseLong(uid));
            entity.setFullName(fullName);
            entity.setSdnType(sdnType);
            entity.setAlias(alias);
            entityList.add(entity);
        }
        repository.saveAll(entityList);
    } catch (Exception e) {
        // 省略异常处理逻辑
        e.printStackTrace();
    }
}

注意事项

  • 代码兼容单个Entry下存在多个<aka>标签的场景,多个别名会用逗号拼接后存入alias字段
  • 已经做了akaList节点的非空判断,部分没有别名的Entry不会报错
  • 如果需要调整别名的拼接格式,直接修改aliasSb的拼接逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:57:03