ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-10-23 15:05:55  阅读:272  来源: 互联网

标签:xml Java String xmlpull parser entity XmlPullParserFactory


概述

        在日常工作中,我们常常遇到需要提取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

 

直接将红框处的内容复制到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为例,演示引入操作:

 

选择下载的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常见错误 - 旁观者 - 博客园

标签:xml,Java,String,xmlpull,parser,entity,XmlPullParserFactory
来源: https://blog.csdn.net/u011461601/article/details/120920295

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有