xml解析---Java解析xml文件
程序员文章站
2022-06-17 08:41:09
...
dom4j解析xml文件、之前用下面的方法,90M的xml,500万行,解析完插入数据库,单线程,不到1小时搞定,而只是解析数据,只用了7秒。
这里解析的xml文件内容和格式如下:
<?xml version="1.0" encoding="utf-8" ?>
<ROWDATA>
<ROW>
<PDND>2015年</PDND>
<QYMC>江西恒泰林业开发有限公司</QYMC>
<RYCH>服务业龙头企业</RYCH>
<SYDW>江西省发展和改革委员会</SYDW>
<XYBSM></XYBSM>
<FLAG>1191</FLAG>
<RECEIVEDATE>2017-6-2 15:10:28</RECEIVEDATE>
<SERIALID4TABLE>50F57872162E497FE053AD0A020AD4FD</SERIALID4TABLE>
</ROW>
<ROW>
<PDND>2015年</PDND>
<QYMC>贵溪市泗丰物流有限公司</QYMC>
<RYCH>服务业龙头企业</RYCH>
<SYDW>江西省发展和改革委员会</SYDW>
<XYBSM></XYBSM>
<FLAG>1191</FLAG>
<RECEIVEDATE>2017-6-2 15:10:28</RECEIVEDATE>
<SERIALID4TABLE>50F57872162F497FE053AD0A020AD4FD</SERIALID4TABLE>
</ROW>
<ROWDATA>
当然,如下的这种编码,是不用转换的,直接去解析即可:
package com.yscredit.xyjx.utils;
import org.apache.commons.collections.map.HashedMap;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.*;
/**
* Created by ligthClouds917
* Date 2017/11/7
* Description:工具类--解析xml文件
*/
public class Dom4JUtil {
private final Logger logger = LoggerFactory.getLogger(getClass());
/**
* 解析xml文件
*
* @param path 文件路径
*/
public static List<Map<String,Object>> transfer(String path){
List<Map<String,Object>> list = new ArrayList<>();
SAXReader reader = new SAXReader();
try {
//加载文件
Document document = reader.read(new File(path));
//获取根结点
Element rowData = document.getRootElement();
//根节点迭代器
Iterator it = rowData.elementIterator();
while(it.hasNext()){
Map<String,Object> map = new HashedMap();
//一级节点
Element row = (Element)it.next();
//一级节点迭代器
Iterator itt = row.elementIterator();
while(itt.hasNext()){
Element rowChild = (Element)itt.next();
//取值
map.put(rowChild.getName(),rowChild.getStringValue());
}
list.add(map);
}
}catch (DocumentException ex){
ex.printStackTrace();
}
return list;
}
}
需要引入的依赖:
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
上面xml数据,在数据外置只包了一层根结点<ROWDATA>,如果还有一层,那就多加一层即可,代码如下:
public static List<Map<String,Object>> transfer(String path){
//windows下复制文件路径斜杠替换处理
path = path.replace("\\\\","/");
List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
SAXReader reader = new SAXReader();
reader.setEncoding("utf-8");
try {
//加载文件
Document document = reader.read(new File(path));
//根节点
Element rootElement = document.getRootElement();
//根节点迭代器
Iterator rootIt = rootElement.elementIterator();
while (rootIt.hasNext()){
Map<String,Object> map = new HashMap();
//一级节点
Element e1 = (Element) rootIt.next();
//一级节点迭代器
Iterator e1It = e1.elementIterator();
while (e1It.hasNext()){
//二级节点
Element e2 = (Element) e1It.next();
//二级节点迭代器
Iterator e2It = e2.elementIterator();
while (e2It.hasNext()){
//三级节点
Element e3 = (Element) e2It.next();
//将元素内容存入map
map.put(e3.getName(),e3.getStringValue());
}
list.add(map);
}
}
}catch (Exception ex){
ex.printStackTrace();
}
return list;
}