首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >xml解析---Java解析xml文件

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

作者头像
IT云清
发布2019-01-22 10:28:59
6.7K0
发布2019-01-22 10:28:59
举报
文章被收录于专栏:IT云清IT云清

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;
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年11月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档