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
相关产品推荐
相关产品推荐

