欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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>

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

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

下面是解析的工具类,传入文件的全路径即可,我这里把内容解析出来,放进了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;
    }





相关标签: xml dom