概述
在日常工作中,我们常常遇到需要提取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常见错误 - 旁观者 - 博客园