繁体   English   中英

使用Spring批处理基于属性值解析xml片段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM