前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用 JDK 自带的 org.w3c.dom 进行对象, map 与 xml 的互相转换

利用 JDK 自带的 org.w3c.dom 进行对象, map 与 xml 的互相转换

作者头像
zcqshine
发布2019-03-12 15:41:43
1.5K0
发布2019-03-12 15:41:43
举报
文章被收录于专栏:zcqshine's blog

利用 JDK 自带的 org.w3c.dom 进行对象,mapxml 的简单互相转换, 其中用到了一个工具类 Hutools 下面是hutoolsmaven依赖

代码语言:javascript
复制
<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>4.1.19</version>
</dependency>

下面是工具类

代码语言:javascript
复制
/**
 * xml 工具,基于 jdk 内置的 xml api
 * @author zcqshine
 * @date 2018/12/8
 */
@Slf4j
public class W3CXmlUtil {
    /**
     * Number 子类的类型名称集合
     */
    private static final Set<String> NUMBER_CHILDREN_CLASS_NAME = new HashSet<>();

    static {
        NUMBER_CHILDREN_CLASS_NAME.add(Integer.class.getName());
        NUMBER_CHILDREN_CLASS_NAME.add(Float.class.getName());
        NUMBER_CHILDREN_CLASS_NAME.add(Short.class.getName());
        NUMBER_CHILDREN_CLASS_NAME.add(Double.class.getName());
        NUMBER_CHILDREN_CLASS_NAME.add(Long.class.getName());
        NUMBER_CHILDREN_CLASS_NAME.add(BigDecimal.class.getName());
        NUMBER_CHILDREN_CLASS_NAME.add(BigInteger.class.getName());
        NUMBER_CHILDREN_CLASS_NAME.add(int.class.getName());
        NUMBER_CHILDREN_CLASS_NAME.add(short.class.getName());
        NUMBER_CHILDREN_CLASS_NAME.add(float.class.getName());
        NUMBER_CHILDREN_CLASS_NAME.add(double.class.getName());
        NUMBER_CHILDREN_CLASS_NAME.add(long.class.getName());
    }

    /**
     * xml 字符串转换为 Object
     * @param xmlStr
     * @param clazz
     * @param <T>
     * @return
     * @throws Exception
     */
    public static <T> T readObjectFormXml(String xmlStr, Class<T> clazz) throws Exception {
        T t;
        if (xmlStr == null || xmlStr.trim().length() == 0){
            throw new IllegalArgumentException("XML content string is empty !");
        } else {
            try {
                t = clazz.newInstance();
                Document document = XmlUtil.parseXml(xmlStr);
                if (document != null){
                    Element element = document.getDocumentElement();
                    if (element != null){
                        NodeList nodeList = element.getChildNodes();
                        for (int i = 0; i<nodeList.getLength(); i++){
                            Node node = nodeList.item(i);
                            if (node instanceof Element){
                                String nodeName = node.getNodeName();
                                String nodeText = node.getTextContent();
                                try {
                                    Field field = t.getClass().getDeclaredField(nodeName);
                                    Method method = t.getClass().getMethod("set" + StrUtil.upperFirst(nodeName),field.getType());
                                    String fieldType = field.getGenericType().getTypeName();
                                    if (fieldType.equals(String.class.getName()) || fieldType.equals(char.class.getName())){
                                        method.invoke(t, nodeText);
                                    } else if (NUMBER_CHILDREN_CLASS_NAME.contains(fieldType) && NumberUtils.isCreatable(nodeText)){
                                        Number number = NumberUtils.createNumber(nodeText);
                                        method.invoke(t, number);
                                    } else if (fieldType.equals(Date.class.getName())){
                                        try {
                                            Date date = DateUtil.parse(nodeText);
                                            method.invoke(t, date);
                                        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                                            log.info("字段:{} 不为时间格式的字符串,放弃解析.", nodeText);
                                        }
                                    }
                                } catch (NoSuchFieldException | SecurityException e) {
                                    log.info("{}属性不存在,继续处理其他属性", nodeName);
                                }
                            }
                        }
                    }
                }
            } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
                log.error("转换 xml 字符串为对象失败. ",e);
                throw new Exception("parse xml to Bean failure.");
            }
        }
        return t;
    }

    /**
     * XML 字符串转 TreeMap
     * @param xmlStr
     * @return
     */
    public static Map<String, String> xml2Map(String xmlStr){
        Map<String,String> map = new TreeMap<>();
        if (StrUtil.isBlank(xmlStr)){
            throw new IllegalArgumentException("xml is empty");
        }else{
            Document document = XmlUtil.parseXml(xmlStr);
            Element element = document.getDocumentElement();
            if (element != null){
                NodeList nodeList = element.getChildNodes();
                for (int i = 0; i < nodeList.getLength(); i++){
                    Node node = nodeList.item(i);
                    String nodeName = node.getNodeName();
                    String nodeText = node.getTextContent();
                    map.put(nodeName, nodeText);
                }
            }
        }
        return map;
    }

    /**
     * Object 转 xml 字符串
     * @param t
     * @param <T>
     * @return
     */
    public static <T> String object2Xml(T t){
        try {
			//得到 DOM 解析器的工厂实例
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            //从 DOM 工厂中获得 DOM 解析器
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.newDocument();
            Element root = document.createElement("xml");
            document.appendChild(root);
            Class clazz = t.getClass();
            Field[] fields = clazz.getDeclaredFields();
            if (fields.length > 0){
                for (Field field : fields) {
                    field.setAccessible(true);
                    String fieldName = field.getName();
                    Element element = document.createElement(fieldName);
                    Object obj = field.get(t);
                    if (obj != null){
                        String value = String.valueOf(obj);
                        element.appendChild(document.createCDATASection(value));
                    }
                    root.appendChild(element);
                }
            }
            return XmlUtil.toStr(document);
        } catch (ParserConfigurationException | IllegalAccessException  e) {
            log.error("对象转 XML 失败. ", e);
        }
        return null;
    }

    /**
     * map 转 xml
     * @param map
     * @return
     */
    public static <T> String map2Xml(Map<String, T> map){
        if (map != null && !map.isEmpty()){
            try {
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                //从 DOM 工厂中获得 DOM 解析器
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document document = builder.newDocument();
                Element root = document.createElement("xml");
                document.appendChild(root);
                map.entrySet().forEach(item -> {
                    String key = item.getKey();
                    T object = item.getValue();
                    String value = null;
                    if (object != null){
                        value = String.valueOf(object);
                    }
                    Element element = document.createElement(key);
                    element.appendChild(document.createCDATASection(value));
                    root.appendChild(element);
                });
                return XmlUtil.toStr(document);
            } catch (ParserConfigurationException e) {
                log.error("map转 xml 失败.", e);
            }
        }
        return null;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/12/11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档