Java:将xml文件里的内容,提取成entity,转存数据库中

概述

        在日常工作中,我们常常遇到需要提取xml文件中的信息,转化成实体类的情况,结合自身工作的经历,做如下总结,与人方便,自己方便。

代码示例

xml格式:

<?xml version="1.0" encoding="utf-8"?>

<Device_Model>
    <Item device_id="2b5c0ac2-3708-4a85-ae20-34c75b281a6c" 
    device_name="低闭锁指示灯" 
    bay_id="743803a4-0cd8-4f5c-a33b-992a2e31e837" 
    bay_name="开关柜" />

</Device_Model>

1.添加pom依赖:

<dependency>
    <groupId>xmlpull</groupId>
    <artifactId>xmlpull</artifactId>
    <version>1.1.3.1</version>
</dependency>

实际查找资料时,我们可能知道要引用的是什么包,但是很多博主并没有给出具体的pom引用,导致我们无法确定具体该引用哪个jar,我这边给出一个小的方法:

可以进入maven仓库网站进行搜索:Maven Central Repository Search

Java:将xml文件里的内容,提取成entity,转存数据库中

Java:将xml文件里的内容,提取成entity,转存数据库中 

直接将红框处的内容复制到pom文件中,刷新maven即可。

2.定义entity

package com.service.inspect.entity.task;

import lombok.Data;
 
@Data
public class RobotPointEntity {
    
    /**
    * device_id
    */
    private String deviceId;

    /**
    * device_name
    */
    private String deviceName;

    /**
    * bay_id
    */
    private String bayId;

    /**
    * bay_name
    */
    private String bayName;
}

这里定义entity的字段,只要与xml中的字段对应即可,因为实际set值时,是需要我们自己手动去一一对应的,所以哪怕我们使用的是项目中已有的entity,字段名无法修改,也可以使用该entity。

3.引用一个包

因为我在寻找解决方案时,是参考了​​​​​​java 解析xml文档---通过XmlPullParser解析方式 - 张旭小侠 - 博客园y

一文,但是拷贝了该文中的代码时,系统运行到

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

时,报了下面这种错

Exception in thread "main" org.xmlpull.v1.XmlPullParserException: 
caused by: org.xmlpull.v1.XmlPullParserException: 
resource not found: /META-INF/services/org.xmlpull.v1.XmlPullParserFactory 
make sure that parser implementing XmlPull API is available

通过查找,找到该问题的解决方法:

[xmlpull]XmlPull常见错误 - 旁观者 - 博客园j

根据该博文中提供的方法,我们需要从http://kxml.sourceforge.net/中下载kxml2.jar ,

然后导入到我们的项目中,然后使用

XmlPullParserFactory factory = 
   XmlPullParserFactory.newInstance(System.getProperty(XmlPullParserFactory.PROPERTY_NAME),
     Thread.currentThread().getContextClassLoader().getClass() );

代替上面的代码即可。

下载kxml2.jar包到本地,然后引入到项目中。此处以intellij为例,演示引入操作:

Java:将xml文件里的内容,提取成entity,转存数据库中

Java:将xml文件里的内容,提取成entity,转存数据库中 

选择下载的kxml2.jar,即可。

4.java 

import com.service.inspect.entity.task.RobotPointEntity;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
 
public class Test { 
    /**
     * 根据XML文件路径,解析成entity
     * @param filePath xml路径
     */
    private void convert2Entity(String filePath)
    {
        List<RobotPointEntity> list = new ArrayList<>();
        try {
            //数据定义
            RobotPointEntity robotPointEntity = null;
            //获得xmlpullparser对象
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance(System.getProperty(XmlPullParserFactory.PROPERTY_NAME),
                    Thread.currentThread().getContextClassLoader().getClass());
            XmlPullParser parser = factory.newPullParser();
            //获取输入流
            FileInputStream fis = new FileInputStream(filePath);
            //设置流和字符集
            parser.setInput(fis, "utf-8");
            //开始解析
            int event = parser.getEventType();
            int num = 0;
            while (event != XmlPullParser.END_DOCUMENT) {
                switch (event) {
                    //开始标记,通常进行相关集合或者对象的初始化
                    case XmlPullParser.START_DOCUMENT:
                        break;
                    case XmlPullParser.START_TAG:
                        String tagName = parser.getName();
                        //得到属性标记通过getName
                        if ("Item".equals(tagName)) {
                            robotPointEntity = new RobotPointEntity();
                            //获得标记后的属性值通过getAttributeName和getAttributeValue两个方法
                            for (int i = 0; i < parser.getAttributeCount(); i++) {
                                String name = parser.getAttributeName(i);
                                String value = parser.getAttributeValue(i);
                                switch (name) {
                                    case "device_id":
                                        robotPointEntity.setDeviceId(value);
                                        break;
                                    case "device_name":
                                        robotPointEntity.setDeviceName(value);
                                    case "bay_id":
                                        robotPointEntity.setBayId(value);
                                        break;
                                    case "bay_name":
                                        robotPointEntity.setBayName(value);
                                        break;
                                    default:
                                        break;
                                }

                            }
                            list.add(robotPointEntity);
                        }
                        break;
                    default:
                        break;
                }
                event = parser.next();
            }
            //解析结束,返回集合
        } catch (Exception e) {

        }
    }
}

5.调用

这里我是直接传入的xml文件路径,可以直接如下引用

convert2Entity("robot.xml");

如果已经获取到InputStream流,也可以把入参改成InputStream,这里自己改造一下即可。

 

参考引用:

java 解析xml文档---通过XmlPullParser解析方式 - 张旭小侠 - 博客园

[xmlpull]XmlPull常见错误 - 旁观者 - 博客园

上一篇:ADO.NET Entity Data Model的乐观锁


下一篇:spring boot jpa 自定义返回实体