业务需求是把图中的xml解析为如下格式的进行前端展示
ps:解析后用一个map来装,注意map的value是子节点名称,并不是节点值!!!
map中的key为: 根节点名,用“-”符号间隔, value为: 子节点名
下面是service层代码
使用了递归的方式来遍历子节点。
如果value是想获取节点内容的话,把getname改为gettext即可。
public class MetaDataConfigServiceImpl implements MetaDataConfigService {
List<Map<String, Object>> elemList = new ArrayList<>();
/**
* 解析XML文件
* @param file
* @return
*/
@Override
public List<Map<String, Object>> xmlAnalysis(MultipartFile file) {
// 文件信息校验
String fileName = file.getOriginalFilename();
if (!StringUtils.endsWith(fileName, StrConstant.XML_EXT)) {
MessageException.throwMsg(fileName + " 的文件格式错误,只能是" + StrConstant.XML_EXT + "格式");
}
if (file.getSize() == 0) {
MessageException.throwMsg("文件内为空(0kb)!");
}
Document document = null;
try {
//创建解析器对象
SAXReader saxReader = new SAXReader();
//读取输入流 得到文档对象
document = saxReader.read(file.getInputStream());
} catch (Exception e) {
log.error("解析失败:{}", e.getMessage());
MessageException.throwMsg("解析XML文件失败!");
}
//通过Document对象获取根元素
Element elem = document.getRootElement();
getElementList(elem);
List<Map<String, Object>> xmlList = elemList.stream().distinct().collect(Collectors.toList());
return xmlList;
}
/**
* 递归遍历子节点
*
* @param element
*/
public void getElementList(Element element) {
List<Element> elements = element.elements();
if (elements.size() == 0) {
//没有子元素
Map<String, Object> map = new HashMap<>(16);
String xpath = element.getPath();
String value = element.getName();
String replace = xpath.substring(1, xpath.lastIndexOf("/")).replace("/", "-");
map.put(replace, value);
elemList.add(map);
} else {
//有子元素
for (Element element1 : elements) {
getElementList(element1);
}
}
}
}
controller层代码
@PostMapping("/xml/analysis")
@ApiOperation(value = "解析xml文件", notes = "map中的key为: 根节点信息, value为: 子节点信息")
public ResultDTO<List<Map<String,Object>>> xmlAnalysis(@RequestParam(value = "file") MultipartFile file) {
List<Map<String, Object>> analysis = metaDataConfigService.xmlAnalysis(file);
return ResultDTO.data(analysis);
}
打印结果
{归档文件信息-基本信息=立档单位统一社会信用代码}
{归档文件信息-基本信息=立档单位名称}
{归档文件信息-基本信息=密级}
{归档文件信息-基本信息=市场主体名称}
{归档文件信息-基本信息=市场主体统一社会信用代码}
{归档文件信息-基本信息=注册码}
{归档文件信息-基本信息=登记类型}
{归档文件信息-基本信息=法定代表人}
{归档文件信息-基本信息=法人证件类型}
{归档文件信息-基本信息=法人证件号}
{归档文件信息-基本信息=核准日期}
{归档文件信息-基本信息=通知书名称}
{归档文件信息-基本信息=通知书文号}
{归档文件信息-基本信息=发放日期}
{归档文件信息-基本信息=归档人}
{归档文件信息-基本信息=归档日期}
{归档文件信息-办理流程信息=环节名称}
{归档文件信息-办理流程信息=责任处科室}
{归档文件信息-办理流程信息=经办人}
{归档文件信息-办理流程信息=意见类型}
{归档文件信息-办理流程信息=意见内容}
{归档文件信息-办理流程信息=办理时间}
{归档文件信息-办理流程信息-aa=bb}
{归档文件信息-办理流程信息-aa=cc}