导入XML文件时,如何利用parentId映射XML中的键值层级结构
基于parentId构建XML数据的层级树形结构
要实现层级映射,核心是把扁平的节点数据通过parentId关联,构建成树形结构。你可以按以下步骤修改代码:
实现思路
- 用Map存储所有节点,通过节点的
key快速查找父节点 - 遍历每个节点,根据
parentId找到对应的父节点,将当前节点添加到父节点的子节点列表中 - 收集所有没有父节点的顶级节点,作为树形结构的根节点
修改后的代码
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
相关产品推荐
相关产品推荐

