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


相关推荐

  • Mac激活idea【2021免费激活】

    (Mac激活idea)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月29日
    313
  • CodeBlocks控制台中文乱码

    CodeBlocks控制台中文乱码中文乱码是个老问题了,涉及乱码的问题无非是编码不统一造成的;涉及编码的地方常见有:1.源文件本身编码2.编译器读取源文件编码3.数据编码(数据库,IO文件等)4.执行输出编码&amp;nbsp;知道乱码的原因有利于解决乱码问题,这些原因在哪个IDE都是通用的&amp;nbsp;关于codeblock这款IDE,这里…

    2022年7月26日
    11
  • bat批处理 for循环_批处理 for /f

    bat批处理 for循环_批处理 for /f一、前言在批处理中,for是最为强大的命令语句,它的出现,使得解析文本内容、遍历文件路径、数值递增/递减等操作成为可能;配合if、call、goto等流程控制语句,更是可以实现脚本复杂的自动化、智能化操作;合理使用for语句,还能使代码大为简化,免除各位编写大量重复语句之苦。二、for语句的基本用法1、举例:正如色彩缤纷的七彩光芒是由红绿蓝三原色构成的一样,最复杂的for语句,也…

    2022年10月9日
    2
  • flowable入门

    flowable入门在使用flowable框架的时候,首先需要引入flowable的jar包,flowablemaven仓库地址为:  org.flowable  flowable-engine  6.0.0.RC1新建flowable.cfg.xml文件,如下图所示:flowable.cfg.xml文件内容如下所示:

    2022年5月21日
    41
  • keil生成bin文件失败_编译后生成的文件扩展名为

    keil生成bin文件失败_编译后生成的文件扩展名为在KEIL魔术棒中通过以下方式生成bin文件时,居然出错,当时震惊了,第一次出现这种情况:使用的命令:fromelf–bin–output.\bin\APP.bin.\STM32_APP\STM32_APP.axf生成的bin文件,居然变成了文件夹!如下图:一开始以为是ROM地址设置的不对,找之前的工程来对比“魔术棒”中的配置,发现没有问题!然后怀疑是工程文件名称太长,或者下划线太多。。。重新新建工程,重命名文件夹等各种操作,发现问题依旧!然后嫉妒怀疑是KEIL的BUG.

    2022年10月20日
    1
  • sqlite如何安装_安装路由器的详细步骤

    sqlite如何安装_安装路由器的详细步骤1.安装sudoapt-getinstallsqlite32.可执行程序sqlite3在/bin目录下,使用sqlite3+空格+数据库文件,可打开数据库3.使用.database查看已连接的数据库会话4.使用.tables查看数据库中的表5.执行SQL进行增删查改Linux下的SQLite数据库查看工具:SQLiteBrowser安装:sudoaptinstallsqlitebrowser-ywindows下的SQLite数据库查看工具:SQLi…

    2025年9月7日
    4

发表回复

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

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