正在解析spring-batch中的固定长度平面xml文件



我的XML文件如下所示,

<?xml version="1.0" encoding="UTF-8"?>
<File fileId="123" xmlns="abc:XYZ" > ABC123411/10/20
XBC128911/10/20
BCD456711/23/22
</File>

这是一个固定长度的平面xml文件,我需要将该文件解析为例如

ABC123411/10/20

作为create Content对象。

public class Content {
private id;
private name;
private date;

// getters
}

例如:

name: ABC
id: 1234
Date: 11/10/20

这就是我正在尝试的

<bean id="reader" class="org.springframework.batch.item.xml.StaxEventItemReader" scope="step">
<property name="resource" value="file:#{jobExecutionContext['source.download.filePath']}" />
<property name="unmarshaller" ref="jaxb2Marshaller" />
<property name="fragmentRootElementNames"  value="File">
</property>
</bean>
<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="packagesToScan">
<list>
<value>com.test.model</value>
</list>
</property>
</bean>

还有我的pojo

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "File", namespace = "//namespace")
public class TestRecord {
@XmlValue
private String data;
public String getData() {
return data;
}
}

现在,这段代码解析xml文件,并将值设置为TestRecord.data中的String,如下所示

ABC123411/10/20
XBC128911/10/20
BCD456711/23/22

使用这种方法,我们需要再次编写一个映射器,通过新行解析这个字符串(来自TestRecord.data(,然后标记每个字符串并分配给Content对象。

我只是想检查一下,我们是否可以使用可用的读取器或任何其他更好的选项在XML配置中做到这一点?谢谢

我会保持简单,并创建一个tasklet来转换这个:

<?xml version="1.0" encoding="UTF-8"?>
<File fileId="123" xmlns="abc:XYZ" > ABC123411/10/20
XBC128911/10/20
BCD456711/23/22
</File>

进入这个:

ABC123411/10/20
XBC128911/10/20
BCD456711/23/22

然后创建具有CCD_ 1的面向块的步骤来解析新文件。这将比试图找到一种方法来忽略行、使用正则表达式来解析内容等更简单。

我使用RegexLineTokenizer而不是FixedLengthTokenizer成功提取了内容。设置strict为false可以防止它被不匹配模式的行阻塞,但它会为它们创建具有空属性的对象。

@Bean
public static RegexLineTokenizer regexpTokenizer() {
RegexLineTokenizer tok = new RegexLineTokenizer();
tok.setRegex("([A-Za-z]{3})(\d{4})(\d{2}/\d{2}/\d{2})");
tok.setNames("name","id","date" );
tok.setStrict(false);
return tok;
}

以下是转换为XML配置的内容:

<bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<property name="resource" value="/file path" />
<property name="linesToSkip" value="2" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean class="org.springframework.batch.item.file.transform.RegexLineTokenizer">
<property name="names"
value="name,id,date"/>
<property name="regex"
value="([A-Za-z]{3})(d{4})(d{2}/d{2}/d{2})"/>
<property name="strict" value="false"/>
</bean>
</property>
<property name="fieldSetMapper">
<!-- Parse the object -->
<bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
<property name="prototypeBeanName" value="testRecord" />
</property>
</bean>
</property>

相关内容

  • 没有找到相关文章

最新更新