使用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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 利用MATLAB求分段函数f(x)

    利用MATLAB求分段函数f(x)利用MATLAB求分段函数F(X)方法一建立M文件:function[y]=ch3_1(x)n=length(x);fori=1:nifx(i)>1y(i)=x(i)^2;elseifx(i)>-1y(i)=1;elsey(i)=3+2*x(i);en…

    2022年5月15日
    60
  • 基于51单片机控制步进电机正反转

    基于51单片机控制步进电机正反转基于51单片机控制步进电机正反转此次采用uln2003模块来链接步进电机;##步进电机工作原理步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。步进电动机的结构形式和分类方法较多,一般按励磁方式分为磁阻式、永磁式和混磁式三种;按相数可分为单相、两相、三相和多相等形式。因此我们可以控制单片机I/O口的电平来控制步进电机,此次设计中采用四相单拍工作方式,在这种工作方式下,A、

    2022年5月31日
    69
  • 苹果绕id完美重启_iphone重启要输入id密码

    苹果绕id完美重启_iphone重启要输入id密码朋友捡到一个iphone6,已经很老的版本了,并且拆修过,手机没有关机等着人家来要,但是第二天就变成iphone已停用,估计别人也是觉得不值得找回了吧。手机就相当于是砖头了,然后交给我,让我尝试激活成功教程试试。在B站看了几个视频,发现网上有很多激活成功教程的软件,但是都是不能当电话用了,只能当做小pad用了,有的软件激活成功教程后不能关机重启,因为一旦关机重启就又锁上了,有的软件激活成功教程后不能登录iCloud,应该就是说不能登录AppID,不能登录应该就不能通过AppStore下载软件了吧。有的软件是通过删除基带的方式,这种方式据

    2022年9月22日
    0
  • 如何解压.bz2文件包

    如何解压.bz2文件包.bz2  解压1:bzip2-dFileName.bz2  解压2:bunzip2FileName.bz2  压缩:bzip2-zFileName  .tar.bz2  解压:tarjxvfFileName.tar.bz2或tar–bzipxvfFileName.tar.bz2  压缩:tarjcvfFileName.tar.bz2Dir…

    2022年6月6日
    62
  • Linux安装anaconda3是否初始化的区别「建议收藏」

    Linux安装anaconda3提示是否希望安装程序通过运行condainit来初始化Anaconda3?DoyouwishtheinstallertoinitializeAnaconda3byrunningcondainit?官方建议的是选yes,那么选择yes和no有什么区别呢?1、选择yes:选择yes的话,bashrc文件中会添加以下内容,这样在打开终端时自…

    2022年4月15日
    304
  • stringtokenizer类的hasmoretokens_java.util

    stringtokenizer类的hasmoretokens_java.utilStringTokenizer:字符串分隔解析类型属于:java.util包。1、构造函数。1.StringTokenizer(Stringstr):构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。2.StringTokenizer(Stringstr,Stringde…

    2022年8月11日
    2

发表回复

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

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