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