一、简介

最近在项目中需要用到XML解析成实体类,并将值封装到实体类属性中,于是封装了一个工具类。下面是具体的代码:

NHXmlParseUtils.java:

package com.ly.cloud.common.webservice;import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Node;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.lang.reflect.Method;
import java.util.*;/*** @description: XML解析统一工具类* @author: weishihuai* @mail: weishihuai@ly-sky.com* @Date: 2020/6/28 14:39* @version: 1.0*/
public class NHXmlParseUtils {private static final Logger logger = LoggerFactory.getLogger(NHXmlParseUtils.class);/*** 解析XML文本映射到实体类** @param returnXml     待解析的XML文本* @param cls           解析生成后映射的Class类对象* @param fieldXmlPaths XMLPaths集合(XML中的标签路径)* @return*/public static List<?> parserXmlToEntity(String returnXml, Class cls, Map<String, String> fieldXmlPaths) {Document document;try {//将给定文本解析为XML文档并返回新创建的文档document = DocumentHelper.parseText(returnXml);//存储属性的名称List<String> filedNames = new ArrayList<>();//存放<属性,values>Map<String, List<Node>> map = new HashMap<>();if (null != fieldXmlPaths && !fieldXmlPaths.isEmpty()) {Iterator iterator = fieldXmlPaths.entrySet().iterator();while (iterator.hasNext()) {Map.Entry entry = (Map.Entry) iterator.next();Object key = entry.getKey();Object value = entry.getValue();List<Node> nodes = document.selectNodes(value.toString());List<Node> list = new ArrayList<>();for (Node node : nodes) {list.add(node);}//循环放入属性-> 对应的节点map.put(key.toString(), list);filedNames.add(key.toString());}}List list = new ArrayList();//循环将节点的值放入到对象中,然后放入到listfor (int i = 0; i < map.get(filedNames.get(0)).size(); i++) {Object instance = cls.newInstance();for (String fieldName : filedNames) {//拼接方法名称String methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);//通过反射获取setter方法Method method = cls.getMethod(methodName, String.class);//通过invoke调用实体类对应的setter方法method.invoke(instance, map.get(fieldName).get(i).getText());}list.add(instance);}return list;} catch (Exception e) {logger.error("XML解析失败!");e.printStackTrace();}return null;}}

测试:

package com.ly.cloud.common.webservice;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class Test {@SuppressWarnings("unchecked")public static void main(String[] args) {String returnXml = "<RdrLoanInfo><Cardno>1607300009</Cardno><Name>李明杰</Name><Title>射雕英雄传</Title><Callno>I247.58/204</Callno><Barcode>A2144907</Barcode><Local>书库(304室)</Local><Author>金庸著</Author><Loandate>20200102</Loandate><Returndate>*20200911</Returndate><Cardno>1607300009</Cardno><Name>李明杰</Name><Title>射雕英雄传</Title><Callno>I247.58/204</Callno><Barcode>A2144904</Barcode><Local>书库(304室)</Local><Author>金庸著</Author><Loandate>20200102</Loandate><Returndate>*20200911</Returndate></RdrLoanInfo>";//解析返回的XML数据Map<String, String> fieldXmlPaths = new HashMap<>();fieldXmlPaths.put("Title", "//RdrLoanInfo/Title");fieldXmlPaths.put("Callno", "//RdrLoanInfo/Callno");fieldXmlPaths.put("Barcode", "//RdrLoanInfo/Barcode");fieldXmlPaths.put("Local", "//RdrLoanInfo/Local");fieldXmlPaths.put("Author", "//RdrLoanInfo/Author");fieldXmlPaths.put("Loandate", "//RdrLoanInfo/Loandate");fieldXmlPaths.put("Returndate", "//RdrLoanInfo/Returndate");List<ReturnBook> studentBooksList = (List<ReturnBook>) NHXmlParseUtils.parserXmlToEntity(returnXml, ReturnBook.class, fieldXmlPaths);System.out.println(studentBooksList);}}/*** 借书信息类*/
class ReturnBook {private String Title;private String Callno;private String Barcode;private String Local;private String Author;private String Loandate;private String Returndate;public String getTitle() {return Title;}public void setTitle(String title) {Title = title;}public String getCallno() {return Callno;}public void setCallno(String callno) {Callno = callno;}public String getBarcode() {return Barcode;}public void setBarcode(String barcode) {Barcode = barcode;}public String getLocal() {return Local;}public void setLocal(String local) {Local = local;}public String getAuthor() {return Author;}public void setAuthor(String author) {Author = author;}public String getLoandate() {return Loandate;}public void setLoandate(String loandate) {Loandate = loandate;}public String getReturndate() {return Returndate;}public void setReturndate(String returndate) {Returndate = returndate;}@Overridepublic String toString() {return "ReturnBook{" +"Title='" + Title + '\'' +", Callno='" + Callno + '\'' +", Barcode='" + Barcode + '\'' +", Local='" + Local + '\'' +", Author='" + Author + '\'' +", Loandate='" + Loandate + '\'' +", Returndate='" + Returndate + '\'' +'}';}
}

运行结果:

[ReturnBook{Title='射雕英雄传', Callno='I247.58/204', Barcode='A2144907', Local='书库(304室)', Author='金庸著', Loandate='20200102', Returndate='*20200911'}, ReturnBook{Title='射雕英雄传', Callno='I247.58/204', Barcode='A2144904', Local='书库(304室)', Author='金庸著', Loandate='20200102', Returndate='*20200911'}]

当然,如果不需要封装到实体类中,也可以稍微改善一下,封装到Map中也是可以的。

XML解析成实体类统一工具类相关推荐

  1. 【用户画像】标签任务开发流程(源码之实体类、工具类、配置文件、DAO层)

    文章目录 一 代码实现 0 开发主线 1 实体类 (1)TagInfo (2)TaskInfo (3)TaskTagRule 2 工具类 (1)连接sql的工具类 测试 (2)专门读取properti ...

  2. 为什么要用Hibernate框架? 把SessionFactory,Session,Transcational封装成包含crud的工具类并且处理了事务,那不是用不着spring了?...

    既然用Hibernate框架访问管理持久层,那为何又提到用Spring来管理以及整合Hibernate呢?把SessionFactory,Session,Transcational封装成包含crud的 ...

  3. 税务局接口-xml格式和对象互转工具类使用说明

    税务局接口-xml格式和对象互转工具类使用说明 注意: 由于税务局接口请求xml数据和返回xml数据和常规的不一样,所以手动写了一个工具类,本工具类只针对税务局xml请求参数和返回参数与对象互相. 说 ...

  4. 根据日期,转换成星座、生肖工具类

    package com.ss.common.util;import java.text.ParseException; import java.text.SimpleDateFormat; impor ...

  5. java json插件安装_IDEAL葵花宝典:java代码开发规范插件:GsonFormat插件将JSONObject格式的String 解析成实体...

    前言: GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 这个教程主要是学习IntelliJ IDEA ...

  6. Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)...

    当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.la ...

  7. Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)

    当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.la ...

  8. xml格式报文的拼装,和解析成实体类

    我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道.所有的接口请求.应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下. 拼接xml格式报文. 从页面表单提交和配 ...

  9. java xml开源操作类,xml解析和操作的开源工具项目涵盖java c++ php 等语言

    XML解析器-Xerces    XML操作库-dom4j    XML文档解析器-Digester    J2ME-的XML-解析器-kXML XML解析类库-MXP1    XML解析器-LibX ...

  10. Java中windows路径转换成linux路径等工具类

    项目中发现别人写好的操作系统相关的工具类: 我总结的类似相关博客:http://www.cnblogs.com/DreamDrive/p/4289860.html 1 import java.net. ...

最新文章

  1. Python包管理工具Distribute的安装
  2. python映射类型是什么意思_Python对象类型
  3. Winform中实现ZedGraph不显示y=0这条刻度线
  4. HTML5获取autoComplete属性:告诉浏览器是否记录之前的输入值
  5. 反思对新项目如何快速上手
  6. 如何实现下拉框的绑定
  7. vs2013编译osg缺少mfc120d.lib
  8. 【牛客 - 280C】约数(数论,GCD,数学,分解因子)
  9. 程序执行原理(科普)
  10. 如何进行Android单元测试
  11. 批量获取ip运营商_通信公司员工收钱开通IP多拨被用于诈骗,6人获刑
  12. ov7740摄像头模块
  13. python给excel排序_python初学—-实现excel里面读数据进行排序
  14. mysql undo表空间_MySQL 8.0.2起UNDO表空间管理更灵活
  15. C++面试之Linux操作系统
  16. 姜小白的Python日记Day10 装饰器
  17. ·2010考研数学二第(19)题——多元微分学:复合函数求偏导、链式法则
  18. uefi启动 多硬盘gtp_UEFI+GPT双硬盘安装Win10+Ubuntu16.04双系统
  19. pyQt5 学习笔记(18)QLineEdit 单行文本输入
  20. windows用Redis Desktop Manager无法通过6379端口连接ubuntu redis问题

热门文章

  1. 马尔科夫决策过程(MDP) : BlackJack (MC-Off Policy)
  2. 【易实战】Spring Cloud微服务架构12要素应用 Twelve‑Factor App
  3. 算法:回溯八 Combinations指定个数组合
  4. 算法:Maximum Depth of Binary Tree(二叉树的最大深度)
  5. 556. 下一个更大元素 III
  6. conda常用命令和基础知识整理
  7. 谈谈考虑了多普勒的信道
  8. CS231n李飞飞计算机视觉 神经网络训练细节part1下
  9. 【ML小结6】关联分析与序列模式关联分析
  10. 32位程序如何在64位系统上运行_32位支持:使用 GCC 交叉编译 | Linux 中国