[英]Parse xml fragment based on attribute value using Spring batch
我想基于属性值解析xml使用spring batch下面是XML供参考。
<?xml version="1.0" encoding="UTF-8"?>
<customerInfo>
<cutommer dept="IT">
<param value="Jane" name="first-name"/>
<param value="Doe" name="last-name"/>
<param value="17 Streets" name="address"/>
<param value="1234567" name="phone-number"/>
</customer>
<cutommer dept="ES">
<param value="Jane" name="first-name"/>
<param value="Doe" name="last-name"/>
<param value="17 Streets" name="address"/>
<param value="1234567" name="phone-number"/>
</customer>
</customerInfo>
基于上面的xml想要只解析dept属性值为“IT”的Customer标签。任何帮助都是appriciated
更新1:
@Configuration
@EnableBatchProcessing
public class ControllerInfoParser_Config extends DefaultBatchConfigurer {
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Bean
public Job parseComponentInfoXML(Step parseComponentInfo,Step partitionStep, CustomJobExecutionerListener customJobExecutionerListener)
throws UnexpectedInputException, ParseException, Exception {
return jobs.get("parseComponentInfoXML").listener(customJobExecutionerListener).start(parseComponentInfo)
.next(partitionStep).build();
}
@Bean
public Step parseComponentInfo(ItemReader<Customer> oneDeptITItemReader) throws UnexpectedInputException, ParseException, Exception {
return steps.get("parseComponentInfo").<Customer, Customer> chunk(1)
.reader(componentInfoReader()).reader(oneDeptITItemReader).processor(componentInfoProcessor())
.writer(componentInfoWriter()).build();
}
@Bean
public ItemReader<Customer> componentInfoReader() throws UnexpectedInputException, ParseException, Exception {
//OneDeptITItemReader <Customer> reader1 = new OneDeptITItemReader<Customer>();
StaxEventItemReader<Customer> reader = new StaxEventItemReader<Customer>();
reader.setResource(new ClassPathResource("xml//customer.xml"));
reader.setFragmentRootElementName("customer");
Jaxb2Marshaller marshaller = new org.springframework.oxm.jaxb.Jaxb2Marshaller();
marshaller.setClassesToBeBound(Customer.class);
// marshaller.setSchema(new ClassPathResource("xml//company.xsd"));
reader.setUnmarshaller(marshaller);
return reader;
}
@Bean
public ItemReader<Customer> oneDeptITItemReader(ItemReader<Customer> ir) {
OneDeptITItemReader<Customer> odIR = new OneDeptITItemReader<Customer>();
odIR.setDelegate(ir);
return odIR;
}
@Bean
public ItemProcessor<Customer, Customer> componentInfoProcessor() {
return new CustomerProcessor();
}
@Bean
public ItemWriter<Object> componentInfoWriter() {
return new SqlWritter();
}
}
public class OneDeptITItemReader <T> implements ItemReader <Customer>{
ItemReader<Customer> delegate;
public ItemReader<Customer> getDelegate() {
return delegate;
}
public void setDelegate(ItemReader<Customer> delegate) {
this.delegate = delegate;
}
@Override
public Customer read() {
boolean read = true;
Customer item = null;
while(read) {
try {
item = delegate.read();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
read =false;
}
read = !"IT".equals(item.getDept());
}
return item;
}
}
停止读取的方法是从ItemReader.read()
返回null
。
编写自定义ItemReader委托,并在找到“IT”部门后停止阅读。
class OneDeptITItemReader implements ItemReader<Customer> {
ItemReader<Customer> delegate;
@Override
public Customer read() {
boolean read = true;
while(read) {
Customer item = delegate.read();
read = read != null && !"IT".equals(item.getDept());
}
return item;
}
}
使用委托时,您必须将委派的读者注册为流,以便让SB管理其生命周期。 请参见6.5委托模式和注册步骤
以下片段为我工作。
停止读取的方法是从ItemReader.read()返回null。 编写自定义ItemReader委托,并在找到“IT”部门后停止阅读。
class OneDeptITItemReader implements ItemReader<Customer> {
StaxEventItemReader<Customer> delegate;
public void setDelegate(StaxEventItemReader<Customer> delegate) {
this.delegate = delegate;
}
@Override
public Customer read() {
boolean read = true;
delegate.open(new ExecutionContext ());
Customer item = null;
while(read) {
item = delegate.read();
read = item != null && !"IT".equals(item.getDept());
}
return item;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.