Java解析XML映射POJO时fields字段转Map的问题
解决方案
核心修改逻辑
- 对POJO字段做类型判断,
Map类型字段走特殊解析逻辑,不直接读取节点文本内容 - 提取Map对应XML节点下的所有子
<field>元素,将name属性作为键,节点文本作为值组装Map - 反射赋值时开启私有字段访问权限,完成属性注入
测试输出适配代码(仅调整打印逻辑,先达到你要的输出效果)
修改你main方法中fields.forEach对应的代码块即可:
fields.forEach(field -> { // 开启私有字段访问权限 field.setAccessible(true); String fieldName = field.getName(); if(element.getAttribute(fieldName).length() > 0) { String attrVal = element.getAttribute(fieldName); System.out.println(fieldName + " - " + attrVal); // 反射赋值逻辑:field.set(metaData实例, attrVal); } else { Node tagNode = element.getElementsByTagName(fieldName).item(0); if (tagNode == null) return; // 判断当前POJO字段是否是Map类型 if (Map.class.isAssignableFrom(field.getType())) { System.out.println(fieldName + " - "); Element mapRootEle = (Element) tagNode; // 遍历所有<field>子节点 NodeList fieldNodes = mapRootEle.getElementsByTagName("field"); Map<String, Object> fieldMap = new HashMap<>(); iterable(fieldNodes).forEach(fNode -> { if (fNode.getNodeType() == Node.ELEMENT_NODE) { Element fEle = (Element) fNode; String key = fEle.getAttribute("name"); Object value = fEle.getTextContent(); fieldMap.put(key, value); // 打印键值对 System.out.println(key + " - " + value); } }); // 反射赋值Map到POJO字段 // field.set(metaData实例, fieldMap); } else { // 普通字段直接取文本内容 String textVal = tagNode.getTextContent(); System.out.println(fieldName + " - " + textVal); // 反射赋值逻辑:field.set(metaData实例, textVal); } } });
通用映射扩展提示
如果要适配任意POJO的通用映射,可以在此基础上扩展:
- 增加自定义注解支持,支持XML节点名、属性名和POJO字段名不匹配的场景
- 增加嵌套POJO类型的递归解析逻辑
- 增加基本类型、包装类型的自动类型转换
内容的提问来源于stack exchange,提问作者davidvera
相关产品推荐
相关产品推荐

