dom4j解析xml文件并且将数据插入mysql数据库的小demo
首先建项目这些基础过程就省略了
这里用的是springboot搭建的项目
在pom.xml里面添加所需依赖
<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
先看一下我们的xml文件是什么结构的,可以清楚的看出来根节点port,子节点dti,以及孙子节点dti,接下来就根据这个xml建数据库表【四个字段,名字随意了】
<?xml version="1.0" encoding="UTF-8"?>
<report generated_time="Thu Nov 15 11:40:33 2018">
<dti type="company" inst="0" desc="用户0" op="op_new">
<dti name="名称">nan有限公司</dti>
<dti name="地址">nan市</dti>
<dti name="电话">111111</dti>
<dti name="上级公司">aaa集团</dti>
</dti>
<dti type="company" inst="1" desc="用户1" op="op_new">
<dti name="名称">wu供电公司</dti>
<dti name="地址">wu市</dti>
<dti name="电话">22222</dti>
<dti name="上级公司">xxx有限公司</dti>
</dti>
</report>
建表:然后建实体类pojo:
这里我建的实体类没有写get/set方法是因为我用了lombok这个插件,可以在idea里的plugins里搜索lombok,以后建实体类就不需要get/set方法了,一个注解就搞定。当然不熟悉的还是可以继续使用,快捷键生成get/set也花不了多久时间:
pojo
DemoEntity.java
package com.example.demo.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DemoEntity {
private String company;
private String address;
private String phone;
private String parent_company;
}
model类
DemoModel.java
package com.example.demo.model;
import com.example.demo.pojo.DemoEntity;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface DemoModel {
// @Insert("insert into demo values(#{name},{address},#{phone},#{parent_company})")
int addJsAsset(List<DemoEntity> list);
}
service类
DemoService
这里可以把new File括号里面的具体文件路径改为传的参数xmlFile
package com.example.demo.service;
import com.example.demo.model.DemoModel;
import com.example.demo.pojo.DemoEntity;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
@Service
public class DemoService {
@Autowired
private DemoModel demoModel;
public int addDemo(String XmlFile) {
ArrayList<DemoEntity> list = new ArrayList<DemoEntity>();
try {
SAXReader reader = new SAXReader();//创建一个读取XML文件的对象
Document document = reader.read(new File("/Users/Desktop/user.xml"));
Element root = document.getRootElement();//获取根节点
for (Iterator<Element> reRoot = root.elementIterator(); reRoot.hasNext(); ) {
Element childElement = reRoot.next();//获取子节点
DemoEntity demoEntity = new DemoEntity();
for (Iterator<Element> reChildElement = childElement.elementIterator(); reChildElement.hasNext(); ) {
Element dom = reChildElement.next();//获取子节点的下一节点
switch (dom.attribute("name").getValue()) { //匹配,当标签里的name与case后的字符串匹配执行相应的数据插入
case "名称":
demoEntity.setName(dom.getText());
break;
case "地址":
demoEntity.setAddress(dom.getText());
break;
case "电话":
demoEntity.setPhone(dom.getText());
break;
case "上级公司":
demoEntity.setParent_company(dom.getText());
break;
}
}
list.add(demoEntity);
}
} catch (Exception e) {
e.printStackTrace();
}
return demoModel.addJsAsset(list);//将读取出的数据插入数据库
}
}
Impl
DemoServiceImpl
里面的path是我们待会测试要用的,这里是/addDemo
package com.example.demo.service.impl;
import com.example.demo.pojo.DemoEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
public interface DemoServiceImpl {
@RequestMapping(path = "/addDemo", method = RequestMethod.POST)
public int addDemo(@RequestBody DemoEntity demoEntity);
}
controller
DemoController
package com.example.demo.controller;
import com.example.demo.pojo.DemoEntity;
import com.example.demo.service.DemoService;
import com.example.demo.service.impl.DemoServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController implements DemoServiceImpl{
@Autowired
private DemoService demoService;
@Override
public int addDemo(DemoEntity demoEntity) {
return demoService.addDemo(demoEntity.toString());
}
}
mapper.xml
demoMapper.xml
说明一下这里的mapper文件可以没有,如果在model里面用了注解@insert,我这里把demoModel.java类里面的那句注释掉了,两种都一样
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.demo.model.DemoModel">
<insert id="addJsAsset" parameterType="com.example.demo.pojo.DemoEntity">
INSERT into `demo`
(`name`, `address`, `phone`, `parent_company`)
VALUES
<foreach collection="list" item="demo" separator=",">
(#{demo.name},
#{demo.address},
#{demo.phone},
#{demo.parent_company})
</foreach>
</insert>
</mapper>
application.yml
这里面是配置的端口号和数据库连接信息
server:
port: 8015
spring:
application:
name: demo
datasource:
url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf8
username: root
password: 123456
最后运行然后测试一下,这里使用了postman,看看效果图,图中标出来的地方分别是需要注意的,具体使用这里不赘述了,简单说就是根据你的代码,里面使用了get还是post方法就选择什么,然后地址栏就是你的端口号加你的方法,下面测试的两条数据是你数据库里的字段根据它的类型随便写两个就行,返回值是int ,所以可以看到最下面是数字2,表示有两条数据插入数据库里了。然后看看数据库插入情况:
插入前:运行代码插入后:
到这里dom4j解析xml文件并把数据插入数据库就已经完成了,还可以自行添加一些删除修改查看所有等功能。