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

导入XML文件时,如何利用parentId映射XML中的键值层级结构

基于parentId构建XML数据的层级树形结构

要实现层级映射,核心是把扁平的节点数据通过parentId关联,构建成树形结构。你可以按以下步骤修改代码:

实现思路

  1. 用Map存储所有节点,通过节点的key快速查找父节点
  2. 遍历每个节点,根据parentId找到对应的父节点,将当前节点添加到父节点的子节点列表中
  3. 收集所有没有父节点的顶级节点,作为树形结构的根节点

修改后的代码

ValidationUtils.validate(input,
        ValidatorField.of("data", Rule.required()))
;
ValidationUtils.validateArray(input.get("data"),
        ValidatorField.of("projectId", Rule.required(), Rule.number(Rule.NumberType.Long)),
        ValidatorField.of("parentId", Rule.number(Rule.NumberType.Long)),
        ValidatorField.of("milestoneId"),
        ValidatorField.of("title", Rule.required()),
        ValidatorField.of("content"),
        ValidatorField.of("timeStart", Rule.required(), Rule.number(Rule.NumberType.Long)),
        ValidatorField.of("timeEnd", Rule.required(), Rule.number(Rule.NumberType.Long)),
        ValidatorField.of("duration", Rule.required()),
        ValidatorField.of("progress", Rule.number(Rule.NumberType.Long)),
        ValidatorField.of("organizationIds"),
        ValidatorField.of("projectRelation")
);

// 1. 用Map存储所有节点,key为节点的key值,方便快速查找
Map<String, JsonNode> allNodes = new HashMap<>();
input.get("data").forEach(node -> {
    String nodeKey = node.get("key").asText();
    allNodes.put(nodeKey, node);
});

// 2. 构建层级关系,给节点添加children属性
List<JsonNode> rootNodes = new ArrayList<>();
allNodes.forEach((key, node) -> {
    // 获取当前节点的parentId
    if (node.has("parentId") && !node.get("parentId").isNull()) {
        String parentKey = node.get("parentId").asText();
        JsonNode parentNode = allNodes.get(parentKey);
        // 如果父节点存在,将当前节点加入父节点的children列表
        if (parentNode != null && parentNode instanceof ObjectNode) {
            ObjectNode parentObjNode = (ObjectNode) parentNode;
            // 初始化children数组(如果不存在的话)
            if (!parentObjNode.has("children")) {
                parentObjNode.putArray("children");
            }
            parentObjNode.get("children").add(node);
        }
    } else {
        // 没有parentId或父节点不存在的,作为根节点
        rootNodes.add(node);
    }
});

// 输出根节点(整个树形结构的入口)
rootNodes.forEach(root -> {
    System.out.println("根节点:" + root.toPrettyString());
});

关键说明

  • 这里假设你的节点是JsonNode(从代码里的input.get("data")和param.get("key")推断),如果是自定义实体类,逻辑类似:给实体类添加List<YourEntity> children属性,再对应处理即可。
  • 如果parentId对应的父节点不存在,当前节点会被视为根节点,你可以根据业务需求调整这部分逻辑(比如抛出异常或过滤掉)。
  • 最终的rootNodes就是整个树形结构的顶层节点,包含所有层级嵌套的子节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:02:34