xml解析---Java解析xml文件

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>

当然,如下的这种编码,是不用转换的,直接去解析即可:

下面是解析的工具类,传入文件的全路径即可,我这里把内容解析出来,放进了Map,然后加入list中,如果想做处理,比如插入数据库,去遍历list集合即可,工具类如下;

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;
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券