Spring Batch之读数据—读XML文件(三十二)

news2024/12/25 12:21:34

一、XML格式文件解析

        XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性,给数据集成与交换带来了极大的方便。XML在Java领域的解析方式有两种,一种叫SAX,另一种叫DOM。SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。但是这两种都不适用于批处理的XML中的解析,因为两种处理方式都没有支持Stream。而StAX是一种支持Stream方式的XML解析方式。

        StAX(The Streaming API for XML),是一种利用拉姆式解析(pull-parsing)XML文档的API。

二、Spring OXM

        OXM是Object-to-XML-Mapping的缩写,它是一个O/X-mapper,负责将Java对象映射为XML数据,或者将XML数据映射为java对象。

        Spring framework在3.0版本中引入了该特性,Spring O/X Mapper仅定义由流行的第三方框架实现的统一切面。要使用Spring的O/X Mapper功能,需提供一个能在Java对象和XML之间转换的组件。通常这样的组件有Castor、XMLBeans、Java Architecture for XML Binding(JAXB)、JiBX和XStream等。

Spring OXM框架如下:

         OXM框架通过Unmarshaller接口将XML文本反序列化为Object对象,通过接口Marshaller将Object对象反序列化为XML文本。同时Spring OXM框架提供了内置的序列化和反序列化组件,包括CastorMarshaller、JibxMarshaller、XmlBeansMarshaller、XStreamMarshaller、Jaxb2Marshaller等。

三、StaxEventItemReader

        StaxEventItemReader实现ItemReader接口,核心作用是将XML文件中的记录转换为Java对象。StaxEventItemReader通过引用OXM组件完成对XML的读操作,负责将XML文件转换为Java对象,并交给处理或者写阶段。

        下图展示了XML文件读取的逻辑框架图,XMLEventReader负责将文件按照StaX的模式读取指定的节点数据,然后交给反序列化组件Unmarshaller完成Java对象的生成。

StaxEventItemReader关键属性

StaxEventItemReader属性类型说明
fragmentRootElementNameString需要转换为Java对象的根节点的名字
fragmentRootElementNameSpaceString需要转换为Java对象的根节点的命名空间
resourceResource需要读取的资源文件
maxItemCountString

能读取的最大条目数

默认值:Integer.MAX_VALUE

strickBoolean

定义读取文件不存在时候的策略,如果为true则抛出异常,如果为false表示不抛出异常。

默认值为:true

unmarshallerIntSpring OXM实现类,负责将XML内容转换为Java对象

        在实际配置StaxEventItemReader时,只需要配置Unmarshaller、Resource两个属性即可。

四、项目实例

1.项目框架

 

2.代码实现

BatchMain.java:

package com.xj.demo24;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Author : xjfu
 * @Date : 2021/10/26 20:01
 * @Description : demo24读XML文件
 */
public class BatchMain {
    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext("demo24/job/demo24-job.xml");
        //Spring Batch的作业启动器,
        JobLauncher launcher = (JobLauncher) context.getBean("jobLauncher");
        //在batch.xml中配置的一个作业
        Job job  = (Job)context.getBean("billJob");

        try{
            //开始执行这个作业,获得处理结果(要运行的job,job参数对象)
            JobExecution result = launcher.run(job, new JobParameters());
            System.out.println(result.toString());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

CreditBill.java:

package com.xj.demo24;

/**
 * @Author : xjfu
 * @Date : 2021/10/26 19:27
 * @Description :
 */
public class CreditBill {
    //银行卡账户ID
    private String accountID = "";
    //持卡人姓名
    private String name = "";
    //消费金额
    private double amount = 0;
    //消费日期
    private String date = "";
    //消费场所
    private String address = "";

    public String getAccountID() {
        return accountID;
    }

    public void setAccountID(String accountID) {
        this.accountID = accountID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getAmount() {
        return amount;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return this.accountID + "," + this.name + "," + this.amount + "," + this.date + "," + this.address;
    }
}

demo24-job.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:batch="http://www.springframework.org/schema/batch"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd">

    <!--导入文件-->
    <import resource="classpath:demo24/job/demo24-jobContext.xml"/>

    <!--定义名字为billJob的作业-->
    <batch:job id="billJob">
        <!--定义名字为billStep的作业步-->
        <batch:step id="billStep">
            <batch:tasklet transaction-manager="transactionManager">
                <!--定义读、处理、写操作,规定每处理两条数据,进行一次写入操作,这样可以提高写的效率-->
                <batch:chunk reader="xmlReader" writer="xmlWriter" commit-interval="2">
                </batch:chunk>
            </batch:tasklet>
        </batch:step>
    </batch:job>
</beans>

demo24-jobContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!--定义作业仓库 Job执行期间的元数据存储在内存中-->
    <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
    </bean>

    <!--定义作业调度器,用来启动job-->
    <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
        <!--注入jobRepository-->
        <property name="jobRepository" ref="jobRepository"/>
    </bean>

    <!--定义事务管理器,用于Spring Batch框架中对数据操作提供事务能力-->
    <bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>

    <!-- XML文件读取 -->
    <bean id="xmlReader" scope="step" class="org.springframework.batch.item.xml.StaxEventItemReader">
        <!--需要转换为Java对象的根节点的名字为credit-->
        <property name="fragmentRootElementName" value="credit"/>
        <!--负责将XML内容转换为Java对象-->
        <property name="unmarshaller" ref="creditMarshaller"/>
        <!--需要读取的资源文件-->
        <property name="resource" value="classpath:demo24/data/demo24-inputXmlFile.xml"/>
    </bean>

    <!--Spring OXM实现类,负责将XML内容转换为Java对象-->
    <bean id="creditMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
        <property name="aliases">
            <util:map id="aliases">
                <entry key="credit" value="com.xj.demo24.CreditBill"/>
            </util:map>
        </property>
    </bean>

    <!--注入实体类-->
    <bean id="creditBill" class="com.xj.demo24.CreditBill" scope="prototype"/>

    <!-- XML文件写入 -->
    <bean id="xmlWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter" scope="step">
        <property name="rootTagName" value="juxtapose"/>
        <property name="marshaller" ref="creditMarshaller"/>
        <property name="resource" value="file:src/main/resources/demo24/data/demo24-outputXmlFile.xml"/>
    </bean>

</beans>

demo24-inputXmlFile.xml:

<?xml version="1.0" encoding="UTF-8"?>
<credits>
    <credit>
        <accountID>4047390012345678</accountID>
        <name>tom</name>
        <amount>100.00</amount>
        <date>2013-2-2 12:00:08</date>
        <address>Lu Jia Zui road</address>
    </credit>
    <credit>
        <accountID>4047390012345678</accountID>
        <name>tom</name>
        <amount>320.00</amount>
        <date>2013-2-3 10:35:21</date>
        <address>Lu Jia Zui road</address>
    </credit>
    <credit>
        <accountID>4047390012345678</accountID>
        <name>tom</name>
        <amount>674.70</amount>
        <date>2013-2-6 16:26:49</date>
        <address>South Linyi road</address>
    </credit>
</credits>
    

3.运行结果

 demo24-outputXmlFile.xml:

<?xml version="1.0" encoding="UTF-8"?><juxtapose><credit><accountID>4047390012345678</accountID><name>tom</name><amount>100.0</amount><date>2013-2-2 12:00:08</date><address>Lu Jia Zui road</address></credit><credit><accountID>4047390012345678</accountID><name>tom</name><amount>320.0</amount><date>2013-2-3 10:35:21</date><address>Lu Jia Zui road</address></credit><credit><accountID>4047390012345678</accountID><name>tom</name><amount>674.7</amount><date>2013-2-6 16:26:49</date><address>South Linyi road</address></credit></juxtapose>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

刷题总结1

暑假第二周练习题 - Virtual Judge (vjudge.net) 该题就是将含4的数字全部跳过&#xff0c;不难发现&#xff0c;这就导致每位数都要少一个树&#xff0c;这就和9进制十分像&#xff0c;我们只要将该数字转化为9进制&#xff0c;然后将该9进制树的每位大于等于4的树加一就行了&…

【CXL】CXL QoS Telemetry 介绍

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

51单片机的智能交通控制系统【含仿真+程序+演示视频带原理讲解】

51单片机的智能交通控制系统【含仿真程序演示视频带原理讲解】 1、系统概述2、核心功能3、仿真运行及功能演示4、程序代码 1、系统概述 该系统由AT89C51单片机、LED灯组、数码管组成。通过Protues对十字路口红绿灯控制逻辑进行了仿真。 每个路口包含了左转、右转、直行三条车道…

rapid_latex_ocr: 更快更好用的公式图像转latex工具

Rapid Latex OCR rapid_latex_ocr是一个将公式图像转为latex格式的工具。仓库中的推理代码来自修改自LaTeX-OCR&#xff0c;模型已经全部转为ONNX格式&#xff0c;并对推理代码做了精简&#xff0c;推理速度更快&#xff0c;更容易部署。仓库只有基于ONNXRuntime或者OpenVINO推…

AI辅助瞄准系统开发与实战(一)

文章目录 前言系统窗体设计提示弹窗功能主体页面 windows窗体绘制矩形绘制自定义线程池完整代码 总结 前言 直接看效果&#xff0c;狗头&#xff1a; 之所以搞这个的话&#xff0c;当然主要一方面是因为确实有点意思在里面&#xff0c;此外在很久以前&#xff0c;也有很多的UP…

光伏并网逆变器低电压穿越MATLAB仿真模型

使用MATLAB 2017b搭建 光伏逆变器低电压穿越仿真模型&#xff0c;boost加NPC拓扑结构&#xff0c;基于MATLAB/Simulink建模仿真。具备中点平衡SVPWM控制&#xff0c;正负序分离控制&#xff0c;pll&#xff0c;可进行低电压穿越仿真。 控制结构完整&#xff0c;波形完美&…

Web入门-HTTP协议

目录 HTTP概述 HTTP特点 HTTP请求协议 请求数据的格式 响应数据的格式 响应的状态码 HTTP协议的解析 HTTP概述 HTTP:Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定浏览器和服务器之间数据传输的规则。(即请求数据和响应数据的格式)以上一篇…

动态规划之119杨辉三角 II(第7道)

题目&#xff1a;给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目链接&#xff1a;119. 杨辉三角 II - 力扣&#xff08;LeetCode&#xff09; 示例&#xff1a; 解法&…

高阶C语言|字符函数和字符串函数--函数的模拟实现

C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串通常放在常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数 字符函数和字符串函数 一、求字符串长度1.1strlen的使用1.2strlen函数的模拟实现 二…

基于linux下的高并发服务器开发(第一章)- 模拟实现 ls-l 命令

这一小节会用到上面两张图的红色框里面的变量 任务&#xff1a; 模拟实现 ls -l 指令 -rw-rw-r-- 1 nowcoder nowcoder 12 12月 3 15:48 a.txt #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <p…

C++中菱形继承中继承不明确问题

C中菱形继承中继承不明确问题 class A { public:virtual void func1(){cout << "A::func1()" << endl;}int _a; };class B:virtual public A { public:virtual void func1(){cout << "B::func1()" << endl;}int _b; };class C:vi…

JavaScript混淆加密:Ty2y平台配置参数详解

Ty2y是国内一个JavaScript混淆加密平台&#xff0c;可以实现在线JS代码混淆加密。它有多达20多项的参数配置。如下图所示&#xff1a; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 本文将对这些配置实现的混淆加密的效果&#xff0c;进行详细说明&…

基于自注意和残差结构的跨模态情感识别融合网络

题目A cross-modal fusion network based on self-attention and residual structure for multimodal emotion recognition译题基于自注意和残差结构的跨模态情感识别融合网络时间2021年代码https://github.com/skeletonNN/CFN-SR A cross-modal fusion network based on self…

verilog实现数码管静态显示

文章目录 verilog实现数码管静态显示一、任务要求二、实验代码三、仿真代码四、仿真结果五、总结 verilog实现数码管静态显示 一、任务要求 六个数码管同时间隔0.5s显示0-f。要求&#xff1a;使用一个顶层模块&#xff0c;调用计时器模块和数码管静态显示模块。 二、实验代码…

DS-SLAM论文翻译

DS-SLAM:面向动态环境的语义可视化SLAM 摘要-同时定位与绘图(SLAM)被认为是智能移动机器人的一项基本能力。在过去的几十年里&#xff0c;许多印象深刻的SLAM系统已经开发出来&#xff0c;并在某些情况下取得了良好的性能。然而&#xff0c;一些问题仍然没有很好地解决&#x…

windows下mingw 编译boost-1.78.0

1.mingw环境设置 添加C:\cygwin64\bin 到环境变量&#xff0c;cmd运行检查是否安装成功 打开cmd&#xff0c;验证&#xff1a; 2.boost编译 创建文件夹 #后期可以删除&#xff0c;安装Boost.Buildmkdir D:\boost_build#后期可以删除&#xff0c;存放mkdir D:\boost_1_78_0\b…

SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案

1.非注解式实现 2.1使用之前要明确使用的业务场景 例如我们在登录时&#xff0c;可以让redis缓存验证码&#xff0c;又如在分类下显示菜品数据时&#xff0c;我们可以对分类和菜品进行缓存数据等等。 2.2导入Redis相关依赖 <dependency><groupId>org.springfra…

Leetcode每日一题(困难):834. 树中距离之和(2023.7.16 C++)

目录 834. 树中距离之和 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 834. 树中距离之和 题目描述&#xff1a; 给定一个无向、连通的树。树中有 n 个标记为 0...n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges &#xff0c; edge…

重定向与转发

转发 package com.qf.controller;import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Htt…

很强!Windows11 渗透测试工具包

项目介绍 基于Windows11打造的一个渗透测试工具包&#xff1b;本项目制作的初衷是帮助渗透新手快速搭建工作环境&#xff0c;工欲善其事&#xff0c;必先利其器&#xff1b; 关注【Hack分享吧】公众号&#xff0c;回复关键字【230516】获取下载链接 目前已集成了各类常用开发环…