好用的对象转xml、xml转对象工具类-支持集合嵌套转换(Java实现)

网上找了很多转换工具,对于自己的业务都不是很合适,所以总结了一下网上的方案,最终定下来是这样子的,主要使用dom4j做操作

maven依赖

<dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version>
</dependency>
package com.aier.cloud.biz.crm.utils;import org.apache.commons.lang3.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.*;/*** @author szz* @since 2019/8/5 10:36*/
public class XmlUtil {/*** XML格式字符串转换为Map** @param strXML XML字符串* @return XML数据转换后的Map* @throws Exception*/public static Map<String, String> xmlToMap(String strXML) throws Exception {try {Map<String, String> data = new HashMap<String, String>();DocumentBuilder documentBuilder = newDocumentBuilder();InputStream stream = new ByteArrayInputStream(strXML.getBytes("GB2312"));org.w3c.dom.Document doc = documentBuilder.parse(stream);doc.getDocumentElement().normalize();NodeList nodeList = doc.getDocumentElement().getChildNodes();for (int idx = 0; idx < nodeList.getLength(); ++idx) {Node node = nodeList.item(idx);if (node.getNodeType() == Node.ELEMENT_NODE) {org.w3c.dom.Element element = (org.w3c.dom.Element) node;data.put(element.getNodeName(), element.getTextContent());}}try {stream.close();} catch (Exception ex) {// do nothing}return data;} catch (Exception ex) {throw ex;}}public static DocumentBuilder newDocumentBuilder() throws ParserConfigurationException {DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);documentBuilderFactory.setXIncludeAware(false);documentBuilderFactory.setExpandEntityReferences(false);return documentBuilderFactory.newDocumentBuilder();}public static org.w3c.dom.Document newDocument() throws ParserConfigurationException {return newDocumentBuilder().newDocument();}/*** 将Map转换为XML格式的字符串** @param data Map类型数据* @return XML格式的字符串* @throws Exception*/public static String mapToXml(Map<String, String> data, String baseTagName, String encoding) throws Exception {org.w3c.dom.Document document = newDocument();org.w3c.dom.Element root = document.createElement(baseTagName);document.appendChild(root);for (String key : data.keySet()) {String value = data.get(key);if (value == null) {value = "";}value = value.trim();org.w3c.dom.Element filed = document.createElement(key);filed.appendChild(document.createTextNode(value));root.appendChild(filed);}TransformerFactory tf = TransformerFactory.newInstance();Transformer transformer = tf.newTransformer();DOMSource source = new DOMSource(document);transformer.setOutputProperty(OutputKeys.ENCODING, encoding);transformer.setOutputProperty(OutputKeys.INDENT, "yes");StringWriter writer = new StringWriter();StreamResult result = new StreamResult(writer);transformer.transform(source, result);String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");try {writer.close();} catch (Exception ex) {}return output;}/*** 重载,默认根节点为Request 编码格式为GB2312** @param data* @return* @throws Exception*/public static String mapToXml(Map<String, String> data) throws Exception {return mapToXml(data, "Request", "GB2312");}/*** 反射设置实体不同类型字段的值 <暂时只支持 日期 字符串 boolean Integer值设置 待扩建>** @param field* @param obj* @param value* @throws Exception*/public static void convertValue(Field field, Object obj, String value)throws Exception {SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");if (field.getGenericType().toString().equals("class java.lang.Integer")) {field.set(obj, Integer.parseInt(value));} else if (field.getGenericType().toString().equals("boolean")) {field.set(obj, Boolean.parseBoolean(value));} else if (field.getGenericType().toString().equals("class java.util.Date")) {field.set(obj, sim.parse(value));} else {field.set(obj, value);}}/*** 解析xml文件返回保存Map的集合,map中可能包含key值为returnCode、desc、totalCount等单字段.* 也可能包含存储对象为List<cls>的集合值.* 获取List值key cls_List** @param requestPath* @param cls* @return map* @throws Exception*/@SuppressWarnings("unchecked")public static Map<String, Object> parseXml2Map(String requestPath,Class<?> cls) throws Exception {Map<String, Object> maps = new HashMap<String, Object>();List<Object> lists = new ArrayList<Object>();SAXReader saxReader = new SAXReader();//当传入的是xml字符串时,采用这个方案Document doc = doc = DocumentHelper.parseText(requestPath);Element et = doc.getRootElement();// 标记List是否为空// boolean bool = true ;// 根节点名字List<Element> rList = et.elements();for (Element element : rList) {List<Element> rLists = element.elements();if (!rLists.isEmpty() && rLists.size() > 0) {//bool = false;// 判断二级节点for (Element e : rLists) {List<Element> li = e.elements();Class<?> cl = (Class<?>) Class.forName(cls.getName());Object ob = cl.newInstance();for (Element element2 : li) {String name = element2.getName();String value = element2.getText();Field field = ob.getClass().getDeclaredField(name);field.setAccessible(true);convertValue(field, ob, value);}lists.add(ob);}} else {maps.put(element.getName(), element.getText());}//maps.put(cls.getSimpleName() + "_List", lists);maps.put("ItemList", lists);}return maps;}/*** https://www.cnblogs.com/interdrp/p/5825453.html1* 解析xml文件返回保存cls的List集合,如果返回码ResultCode=1时则返回List为null** @param xml* @param cls* @return* @throws Exception*/@SuppressWarnings("unchecked")public static List<?> parseXml2List(String xml, Class<?> cls)throws Exception {List<Object> lists = null;Document doc = DocumentHelper.parseText(xml);Element et = doc.getRootElement();String root = et.getName();// 查看返回码是否为真.List<Element> list = doc.selectNodes("//" + root + "/ResultCode");if (!list.isEmpty() && list.size() > 0) {Element element = list.get(0);String returnResult = element.getText();if (returnResult.equals("0")) {List<Element> father = doc.selectNodes("//" + root + "/" + cls.getSimpleName() + "s");//判断对象父节点是否有包含数据if (father != null && !father.isEmpty() && father.size() == 1) {List<Element> userLists = father.get(0).elements();if (userLists != null && !list.isEmpty()) {lists = new ArrayList<Object>();for (Element e : userLists) {List<Element> li = e.elements();Class<?> cl = (Class<?>) Class.forName(cls.getName());Object ob = cl.newInstance();for (Element element2 : li) {String name = element2.getName();String value = element2.getText();Field field = ob.getClass().getDeclaredField(name);field.setAccessible(true);convertValue(field, ob, value);}lists.add(ob);}}}}}return lists;}/*** 解析xml文件返回保存cls的List集合,如果返回码ResultCode=1时则返回List为null** @param url* @param cls* @return* @throws Exception*/@SuppressWarnings("unchecked")public static List<?> parseXml2List(URL url, Class<?> cls)throws Exception {List<Object> lists = null;SAXReader saxReader = new SAXReader();Document doc = saxReader.read(url);Element et = doc.getRootElement();String root = et.getName();// 查看返回码是否为真.List<Element> list = doc.selectNodes("//" + root + "/ResultCode");if (!list.isEmpty() && list.size() > 0) {Element element = list.get(0);String returnResult = element.getText();if (returnResult.equals("0")) {List<Element> father = doc.selectNodes("//" + root + "/" + cls.getSimpleName() + "s");//判断对象父节点是否有包含数据if (father != null && !father.isEmpty() && father.size() == 1) {List<Element> userLists = father.get(0).elements();if (userLists != null && !list.isEmpty()) {lists = new ArrayList<Object>();for (Element e : userLists) {List<Element> li = e.elements();Class<?> cl = (Class<?>) Class.forName(cls.getName());Object ob = cl.newInstance();for (Element element2 : li) {String name = element2.getName();String value = element2.getText();Field field = ob.getClass().getDeclaredField(name);field.setAccessible(true);convertValue(field, ob, value);}lists.add(ob);}}}}}return lists;}/*** 解析xml文件返回保存Map的集合,map中可能包含key值为returnCode、desc、totalCount等单字段.* 也可能包含存储对象为List<cls>的集合值.* 获取List值key cls_List** @param requestPath* @param cls* @return map* @throws Exception*/@SuppressWarnings("unchecked")public static Map<String, Object> parseXml2MapOld(String requestPath,Class<?> cls) throws Exception {Map<String, Object> maps = new HashMap<String, Object>();List<Object> lists = new ArrayList<Object>();SAXReader saxReader = new SAXReader();//Document doc = saxReader.read(new File(requestPath));//Document doc = saxReader.read(new URL(requestPath));//当传入的是xml字符串时,采用这个方案Document doc = doc = DocumentHelper.parseText(requestPath);Element et = doc.getRootElement();// 标记List是否为空// boolean bool = true ;// 根节点名字List<Element> rList = et.elements();for (Element element : rList) {List<Element> rLists = element.elements();if (!rLists.isEmpty() && rLists.size() > 0) {//bool = false;// 判断二级节点for (Element e : rLists) {List<Element> li = e.elements();Class<?> cl = (Class<?>) Class.forName(cls.getName());Object ob = cl.newInstance();for (Element element2 : li) {String name = element2.getName();String value = element2.getText();Field field = ob.getClass().getDeclaredField(name);field.setAccessible(true);convertValue(field, ob, value);}lists.add(ob);}} else {maps.put(element.getName(), element.getText());}//maps.put(cls.getSimpleName() + "_List", lists);maps.put("ItemList", lists);}return maps;}/*** 只获取返回码0为保存成功(true)1为保存失败(false)*/@SuppressWarnings("unchecked")public static boolean parseXmlReturnCode(String xml) {boolean bool = false;try {Document doc = DocumentHelper.parseText(xml);Element et = doc.getRootElement();String root = et.getName();// 查看返回码是否为真.List<Element> list = doc.selectNodes("//" + root + "/ResultCode");if (!list.isEmpty() && list.size() > 0) {Element element = list.get(0);String returnResult = element.getText();if (returnResult.equals("0")) {bool = true;}}} catch (Exception e) {e.printStackTrace();}return bool;}/**** https://blog.csdn.net/javaniche/article/details/79655473* 格式化输出xml** @param document* @return* @throws DocumentException* @throws IOException*/public static String formatXml(Document document) throws DocumentException, IOException {// 格式化输出格式OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("GB2312");StringWriter writer = new StringWriter();// 格式化输出流XMLWriter xmlWriter = new XMLWriter(writer, format);// 将document写入到输出流xmlWriter.write(document);xmlWriter.close();return writer.toString();}public static Document map2Xml(Map<String, Object> map, String node, String type) throws Exception {Document document = DocumentHelper.createDocument();Element nodeElement = document.addElement(node);map2Xml(map, nodeElement, type);return document;}public static final String map2Xml_TYPE_listElementWrapper = "1";private static void map2Xml(Map<String, Object> map, Element nodeElement, String type) throws Exception {for (Map.Entry<String, Object> entry : map.entrySet()) {String key = (String) entry.getKey();Object value = entry.getValue();if ((value instanceof List) && StringUtils.isBlank(type)) {Element element = nodeElement.addElement(key);List<Map<String, Object>> list = (List<Map<String, Object>>) value;for (Map<String, Object> subMap : list) {Element itemElement = element.addElement("Item");map2Xml(subMap, itemElement, type);}} else if ((value instanceof List) && StringUtils.isNotBlank(type) && type.contains(map2Xml_TYPE_listElementWrapper)) {List<Map<String, Object>> list = (List<Map<String, Object>>) value;for (Map<String, Object> subMap : list) {Element element = nodeElement.addElement(key);map2Xml(subMap, element, type);}} else if (value instanceof Map) {Element element = nodeElement.addElement(key);Map<String, Object> valueMap = (Map<String, Object>) value;map2Xml(valueMap, element, type);} else if (value instanceof String) {Element keyElement = nodeElement.addElement(key);keyElement.setText((String) value);} else if (value instanceof Integer) {Element keyElement = nodeElement.addElement(key);keyElement.setText(((Integer) value).toString());} else if (value instanceof BigDecimal) {Element keyElement = nodeElement.addElement(key);keyElement.setText(((BigDecimal) value).toString());} else if (value instanceof Date) {Element keyElement = nodeElement.addElement(key);keyElement.setText((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(value)).toString());} else {throw new Exception("不支持的 value 类型");}}}}

好用的对象转xml、xml转对象工具类-支持集合嵌套转换(Java实现)相关推荐

  1. java+基于dom4j工具类_基于dom4j的xml映射实体的工具类(java)

    基于dom4j的xml映射实体的工具类(java) 工具是基于dom4j,使用反射使实体属性与xml的标签关联,目前兼容List,Map后续更新兼容. 历史更新: 发布-2019-6-22 增加注解@ ...

  2. 使用xfire webservice接口开发,obj与xml相互转换好用工具类,不需要写大量的转换代码,亲测可用

    webservice接口开发,旧工程中存在使用xfire开发的接口,对象转换为xml和xml转换为对象的时候需要些大量的代码,工作量很大.现在提供一个比较好的对象转换为xml的工具. <!-- ...

  3. java中拼接xml方法_Java常用工具类,拼接XML格式的字符串,非常好用

    import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.u ...

  4. Java工具类--Map集合与Java对象相互转换

    import org.springframework.cglib.beans.BeanMap;import java.util.HashMap; import java.util.Map;public ...

  5. XML与JavaBean相互转换工具

    XML与JavaBean相互转换工具 import com.thoughtworks.xstream.XStream; import java.util.Map; import java.util.I ...

  6. java解析xml工具类_通过dom4j解析XML字符串XMLDocUtil工具类转换为XML文档及获取指定根节点及指定节点路径内容代码示例...

    一.前言 通过dom4j解析XML文档的XMLDocUtil工具类,进行解析xml字符串为Document文档对象.获取根节点元素路径内容getRootElement.获取唯一路径节点的值getSin ...

  7. java xml最火的的工具_几种高效的Java工具类推荐

    本文将介绍了十二种常用的.高效的Java工具类 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类. 在开发中,使用这些工具类,不仅可以提高编码效率,还 ...

  8. java开发AmazonS3对象存储的工具类

    上两节说了文档上默认不用证书的方式操作对象,但大部分时候出于安全考虑是要用到证书认证的.下面就是对这种情况下的对象操作. 1.引入pom.xml <project xmlns="htt ...

  9. 常用的对象处理工具类

    package com.xutil.data;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject ...

最新文章

  1. 利用Python爬虫requests+BeautifulSoup实现丁香营销师招聘爬取(源码)
  2. C2059 语法错误:“)”
  3. 生成0字节的core文件,gdb 无法识别core 文件
  4. 数学建模学习笔记——插值算法
  5. GitHub 4K+Star!SpaceX火箭数据开放API接口,可用Python进行抓取分析
  6. springmvc的相关配置文件
  7. spark shell的运行模式汇总
  8. 《鸿蒙理论知识02》HarmonyOS开发平台和工具
  9. pytorch 模型可视化_【深度学习】高效使用Pytorch的6个技巧:为你的训练Pipeline提供强大动力...
  10. 【2017年第1期】专题导读:大数据与信用评价系统
  11. 字符串处理 —— 回文串相关 —— 求最长回文子串
  12. c# list集合根据某个字段去重_java8 List 根据对象某个字段或多个字段去重、筛选、List转Map、排序、分组、统计计数等等...
  13. Android安全防护之旅---Android应用反调试操作的几种方案解析
  14. SoapUI接口测试——关联——参数化
  15. IDEA 实用小技巧:万能的临时文件
  16. 详细“企业库”编写流程
  17. 修改input提示文字样式
  18. 火箭十八连胜内幕大曝光(坚持看完)(搞笑)
  19. 机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归
  20. arnold ass standin 代理模型批量查询 与替换工具发布1.0

热门文章

  1. [转]Oracle中字符集的类型决定varchar2的字符长度
  2. 如何获得线程对象,获得Thread对象,得到线程对象,根据线程名获得线程对象,多线程取得线程对象...
  3. Telnet 1433端口
  4. 这里有一个让你变成技术大牛的机会
  5. python3 yield_Python3基础 yield 在函数中的用法示例
  6. golang for range原理(转载)
  7. npm常用命令(扩展中...)
  8. java test 用法,pytest基本用法简介
  9. KVM Disk Cache简析
  10. ONVIF协议实现1:Server端Discovery的实现详解