使用dom4j解析xml工具类[通俗易懂]

使用dom4j解析xml工具类[通俗易懂]使用dom4j解析xml首先在项目中加入dom4j的依赖<dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6</version></depende…

大家好,又见面了,我是你们的朋友全栈君。

使用dom4j解析xml

首先在项目中加入dom4j的依赖

<dependency>
       <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6</version>
 </dependency>

附上基于dom4j解析xml的工具类

/* * Copyright © 1998 - 2018 Tencent. All Rights Reserved * www.tencent.com * All rights reserved. */
package com.tencent.tusi.iot.utils;

import org.dom4j.*;
import org.dom4j.io.SAXReader;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import static com.tencent.tusi.iot.common.PublicConfig.*;

/** * @author shanpeng */
// 解析xml字符串的工具类
public class XMLUtils{ 
   
    /** * 获取xml对象的根节点 * @param document * @return root */
    public static Element getRoot(Document document){ 
   
        Element root = null;
        root = document.getRootElement();
        return root;
    }
    /** * 获取fieldName的属性值 * @param document * @return fields */
    public static List<String> getFields(Document document){ 
   
        List<String> fields = new ArrayList<>();
        Element root = getRoot(document);
        if (null != root){ 
   
            // 存储遍历节点
            for (Iterator i = root.elementIterator(); i.hasNext();) { 
   
                Element el = (Element) i.next();
                for (Iterator j = el.elementIterator(FIELD); j.hasNext();){ 
   
                    Element e2 = (Element) j.next();
                    Attribute attribute = e2.attribute(FIELDNAME);
                    fields.add(attribute.getValue());
                }
            }
        }
        return fields;
    }

    /** * 根获取每行数据形成一个列表 * @param document * @return rows */
    public static List<Element> getRows(Document document){ 
   
        List<Element> rows = new ArrayList<>();
        Element root = getRoot(document);
        List<String> fields = getFields(document);
        if (!fields.isEmpty()){ 
   
            for (Iterator i = root.elementIterator(); i.hasNext();) { 
   
                Element el = (Element) i.next();
                for (Iterator k = el.elementIterator(ROW);k.hasNext();){ 
   
                    // 一行数据
                    Element e2 = (Element) k.next();
                    rows.add(e2);
                }
            }
        }
        return rows;
    }

    /** * 根据url获取xml对象 * @param url * @return document */
    public static Document getXmlFromUrl(String url) throws DocumentException{ 
   
        Document document=null;
        SAXReader saxReader = new SAXReader();
        document = saxReader.read(url);
        return document;
    }

    /** * 根据xml字符串获取xml对象 * @param xmlString * @return document */
    public static Document getXmlFromString(String xmlString) throws DocumentException { 
   
        Document document = DocumentHelper.parseText(xmlString);
        return document;
    }

    /** * xml一行转对象 * @param document * @param clazz * @param row * @return * row ---> pojo */
    public static Object getObject(Document document,Class<?> clazz,Element row) { 
   
        Object obj=null;
        try { 
   
            obj=clazz.newInstance();//创建对象
            List<String> fields = getFields(document);
		// 获取属性名
                for(int i=0;i<fields.size();i++){ 
   
                    String propertyname = fields.get(i);
                    String propertyvalue = row.attribute(fields.get(i)).getValue();
                    Method method = obj.getClass().getMethod("set"+propertyname,String.class);
                    method.invoke(obj,propertyvalue);
                }
        } catch (Exception e) { 
   
            e.printStackTrace();
        }
        return obj;
    }

    public static void main(String[] args) throws DocumentException { 
   
    }
    }
}

因为工作中接收的数据都是固定格式的,所以其中ROW、FIELD、FIELDNAME放在常量里面。
注意点:

Method method = obj.getClass().getMethod("set"+propertyname,String.class);
method.invoke(obj,propertyvalue);

该代码块中只能识别为String类型的属性,所以使用getObject时务必使传过来的类中的属性全部是String类型的,具体使用时再做转换。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152052.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于Pycharm Interpreter报错 Invalid Python SDK/Permission Denied问题解决方案「建议收藏」

    关于Pycharm Interpreter报错 Invalid Python SDK/Permission Denied问题解决方案「建议收藏」1.问题背景之前用了Pycharm好好的,结果运行个简单的test.py文件,里面的内容是:print(“helloworld”)居然报错,程序运行居然不是exitcode0报错结果如下:程序返回了一个异常参数,这个参数实际上是说:“你的python解释器未安装成功”。Processfinishedwithexitcode-1073741515(0xC0000135)网上百度了这个参数报错的意思,我就去找了我的解释器:【File】–>【Setting】,找到解释

    2022年8月26日
  • hibernate与mybatis的区别优缺点对比

    hibernate与mybatis的区别优缺点对比现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加得心应手。第一方面:开发速度的对比就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求去考虑究竟哪一个更适合项目开发,比如:一个项目中用到的复杂查询基本没有,就是简单的增删改查,这样选择hiberna

    2022年9月11日
  • Django(14)模型中常用的属性(超详细)[通俗易懂]

    Django(14)模型中常用的属性(超详细)[通俗易懂]模型中常用字段字段说明AutoField一般不需要使用这个类型,自增长类型,数据表的字段类型为整数,长度为11位BigAutoField自增长类型,数据表的字段类型为bigint,长度为2

    2022年7月31日
  • ubuntu安装Qt creator

    ubuntu安装Qt creatorUbuntu安装Qtcreator#ubuntu版本16.04#Qt不限版本

    2022年10月15日
  • 发挥人的主观能动性必须的前提是_发挥人主观能动性的基本途径是

    发挥人的主观能动性必须的前提是_发挥人主观能动性的基本途径是曾任百度研发工程师。2015年加入多点在线科技有限公司,任大数据团队负责人、高级架构师。负责研发了夜神App推荐系统、多点BI平台、AiAdmobi广告平台、RTB投放系统、CTR预估及用户画像等。与阿里云的各种大数据服务深度结合,熟悉Maxcompute、机器学习、推荐系统等服务。也熟悉基于EMR上开源工具的使用,包括Spark,Yarn,…

    2022年10月28日
  • idea配置tomcat服务器运行项目_idea添加tomcat服务器

    idea配置tomcat服务器运行项目_idea添加tomcat服务器需求背景      从Eclipse转IDEA后面对的第一个问题,就是要为IDEA配置tomcat服务,否则不可用。那么,功能需求      那么,该如何配置呢?1、点击“EditConfigurations”进入tomcat服务编辑页面。如下图所示:2、点击…

    2022年10月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号