栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java使用SAX解析器解析XML文件

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java使用SAX解析器解析XML文件

目录
      • 一、概述
      • 二、待解析的xml文件
      • 三、XmlRow类
      • 四、SAXHandler类
      • 五、测试

一、概述

SAX,也称为Simple API for XML,是jdk自带的 用于解析 XML 文档 API。它是一种基于流的解析方式,边读取XML边解析,并以事件回调的方式让调用者获取数据。因为是一边读一边解析,所以无论XML有多大,占用的内存都很小,所以 SAX 具有高效的内存管理。

二、待解析的xml文件

    
        
        
    
    
        
            
                2022年5月某公司托管人员五险一金明细表
            
        
        
            
                部门
            
            
                序号
            
            
                姓名
            
            
                公积金单位部分(社保)
            
            
            
            
        
        
    
    
        
            
                2022年6月某公司托管人员五险一金明细表
            
        
        
            
                信息中心
            
            
                1
            
            
                张三
            
            
                1252.43
            
            
                313.11
            
            
                
            
        
    

三、XmlRow类
package com.xmlutil;

import java.util.ArrayList;

public class XmlRow {
    //存储Cell中Data的数据
    public ArrayList cellList = new ArrayList<>();
    //存储Cell中ss:MergeAcross的属性值
    public ArrayList cellMergeAcrossList = new ArrayList<>();
    //存储Cell中ss:MergeDown的属性值
    public ArrayList cellMergeDownList = new ArrayList<>();

    @Override
    public String toString() {
        return cellList.toString();
    }
}
四、SAXHandler类
package com.xmlutil;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

public class SAXHandler extends DefaultHandler {

    private List xmlRowList = new ArrayList<>();
    //存储所有Worksheet的内容
    public List> xmlSheetList = new ArrayList<>();
    //存储所有Worksheet的ss:Name属性值
    public List sheetNameList = new ArrayList<>();


    XmlRow xmlRow = null;
    String content = null;
    Integer mergeAcross = null;
    Integer mergeDown = null;

    @Override
    //当开始标签被找到时
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        int size = attributes.getLength();
        switch (qName) {
            //Create a new Row object when the start tag is found
            case "Worksheet":
                xmlRowList.clear();
                for (int i = 0; i < size; i++) {
                    String attName = attributes.getQName(i);
                    if ("ss:Name".equals(attName)) {
                        sheetNameList.add(attributes.getValue(i));
                    }
                }
                break;
            case "Row":
                xmlRow = new XmlRow();
                break;
            case "Cell":
                mergeAcross = mergeDown = 0;
                for (int i = 0; i < size; i++) {
                    String attName = attributes.getQName(i);
                    if ("ss:MergeAcross".equals(attName)) {
                        mergeAcross = Integer.parseInt(attributes.getValue(i));
                    }
                    if ("ss:MergeDown".equals(attName)) {
                        mergeDown = Integer.parseInt(attributes.getValue(i));
                    }
                }
                break;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        switch (qName) {
            case "Worksheet":
                //xmlRowList深拷贝为newXmlRowList
                String listStr = JSONObject.toJSONString(xmlRowList);
                List newXmlRowList = JSON.parseArray(listStr, XmlRow.class);
                xmlSheetList.add(newXmlRowList);
                break;
            case "Row":
                xmlRowList.add(xmlRow);
                break;
            case "Cell":
                xmlRow.cellMergeAcrossList.add(mergeAcross);
                xmlRow.cellMergeDownList.add(mergeDown);
                break;
            case "Data":
                xmlRow.cellList.add(content);
                break;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        content = String.copyValueOf(ch, start, length).trim();
    }
}

五、测试
import com.alibaba.fastjson.JSON;
import com.xmlutil.SAXHandler;
import org.apache.commons.io.IOUtils;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.poifs.filesystem.FileMagic;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.*;
import java.nio.charset.Charset;

public class MainServer {
    public static void main(String[] args) throws Exception {
        File file = new File("F:\excels\textXml.xml");
        SAXParserFactory parserFactor = SAXParserFactory.newInstance();
        SAXParser parser = parserFactor.newSAXParser();
        SAXHandler handler = new SAXHandler();
        String fileContent = IOUtils.toString(new FileInputStream(file), Charset.defaultCharset());
        ByteArrayInputStream bis = new ByteArrayInputStream(fileContent.getBytes());
        parser.parse(bis, handler);

        System.out.println(JSON.toJSONString(handler.xmlSheetList));
    }

输出:

[
	[{
		"cellList": ["2022年5月某公司托管人员五险一金明细表"],
		"cellMergeAcrossList": [7],
		"cellMergeDownList": [0]
	}, {
		"cellList": ["部门", "序号", "姓名", "公积金单位部分(社保)"],
		"cellMergeAcrossList": [0, 3, 1, 0, 0, 0, 0],
		"cellMergeDownList": [0, 2, 0, 2, 0, 0, 0]
	}, {
		"cellList": [],
		"cellMergeAcrossList": [],
		"cellMergeDownList": []
	}],
	[{
		"cellList": ["2022年6月某公司托管人员五险一金明细表"],
		"cellMergeAcrossList": [7],
		"cellMergeDownList": [0]
	}, {
		"cellList": ["信息中心", "1", "张三", "1252.43", "313.11", ""],
		"cellMergeAcrossList": [3, 0, 0, 0, 0, 0],
		"cellMergeDownList": [0, 0, 0, 6, 0, 0]
	}]
]

参考:

Parsing an XML File Using SAX Parser

Parsing an XML File Using StAX

excel-xml-reader

使用SAX

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/970182.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号