java - 如何在 Spring Batch 中使用 StaxEventItemReader 处理复杂的 xml

标签 java spring jaxb spring-batch xmlreader

请帮我写 ItemReader()

    <File>
        <FileDate>05/28/2016</FileDate>
        <RecordCount>75</RecordCount>
        <Transaction>
           <RecordID>1</RecordID>
           <MemberDetails>
               <Id>A2334549</Id>
               <MemberDemoData>
                   <SubID>89890734548557</SubID>
                   <MemberSuffix>01</MemberSuffix>
                   <SSN>XXXXX</SSN>
                   <CategoryCode>B</CategoryCode>
                   <Gender>F</Gender>
                   <LastName>Naaz</LastName>
                   <FirstName>Affu</FirstName>
                   <MiddleInitial>H</MiddleInitial>
                   <BirthDate>04/02/1990</BirthDate>
                   <HICNumber>4567376739A</HICNumber>
                   <PhoneNumber>894567893</PhoneNumber>
                   <ProviderID>09678546</ProviderID>
                   <PCPOverride>N</PCPOverride>
                   <Address>
                       <AddressType>HOME</AddressType>
                       <Address1>2226 Indira nagar RD</Address1>
                       <City>Noida</City>
                       <State>Delhi</State>
                       <Zip>525001</Zip>
                       <County>India</County>
                   </Address>
                   <Address>
                       <AddressType>MAIL</AddressType>
                       <Address1>2226 Indira nagar RD</Address1>
                       <City>Noida</City>
                       <State>Delhi</State>
                       <Zip>525001</Zip>
                       <County>India</County>
                   </Address>
                   <AgentInfo>
                       <MailAgentNo>40</MailAgentNo>
                       <AgentNo>67894</AgentNo>
                   </AgentInfo>
              </MemberDemoData>
              <Package>
                 <Plan>Yu8883</Plan>
                 <PlanId>009</PlanId>
                 <SegmentId>104</SegmentId>
                 <Group>000987666</Group>
                 <SubGroup>B004</SubGroup>
                 <Class>0004</Class>
                 <PartD>
                     <BIN>789034</BIN>
                     <PCN>*******</RxPCN>
                 </PartD>
                 <EffectiveDate>09/01/2016/01/2016</EffectiveDate>
                 <TerminationDate>12/31/2016</TerminationDate>
             </Package>
             <LICSInfo>
                 <SubsidyLevel>100</SubsidyLevel>
                 <CopayCategory>1</CopayCategory>
                 <SubsidyLevelStartDate>08/11/2016</SubsidyLevelStartDate>
             </LICSInfo>
             <MedihealthData>
                    <PartA>
                       <EffectiveDate>02/01/2008</EffectiveDate>
                    </PartA>
                    <PartB>
                       <EffectiveDate>02/01/2008</EffectiveDate>
                    </PartB>
                    <ESignDate>
                       <EffectiveDate>08/16/2016</EffectiveDate>
                    </ESignDate>
            <ElectionPeriod>S</ElectionPeriod>
                    <EnrollmentDate>
                       <EffectiveDate>08/01/2016</EffectiveDate>
                    </EnrollmentDate>
               </MedihealthData>
               <BillingData>
                    <PremiumWithHold>D</PremiumWithHold>
               </BillingData>
           </MemberDetails>
        </Transaction>
        <Transaction>
         -------
        </Transaction>
        <Transaction>
         ------
        </Transaction>
        <Transaction>
         -------
        </Transaction>
    </File>

我为 File、Transaction、MemberDetails、MemberDemoData、Address、AgentInfo、Package、PartD、LICSInfo、MedihealthData、PartA、PartB、ESignDate、EnrollmentDate、BillingData 生成了 jaxb 类

现在在下面的 ItemReader 方法中代替“?”我应该使用什么类名。请帮我。
    public ItemReader<?> fileXmlReader(@Value("#{stepExecution}") StepExecution stepExecution) {

            StaxEventItemReader<?> xmlFileReader = new StaxEventItemReader<>();

            xmlFileReader.setResource(new ClassPathResource("/File.xml"));

            xmlFileReader.setFragmentRootElementNames( new String[] {?}); (or )
            xmlFileReader.setFragmentRootElementName(?)

            Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
            marshaller.setClassesToBeBound(?);

            xmlFileReader.setUnmarshaller(marshaller);

            return xmlFileReader;

    }

最佳答案

我找到了以下可能对其他人有帮助的解决方案:

@Bean
public StaxEventItemReader<Entity> reader() {

    XStreamMarshaller unmarshaller = new XStreamMarshaller();

    Map<String, Class> aliases = new HashMap<>();
    aliases.put("File", Entity.class);

    unmarshaller.setAliases(aliases);

    StaxEventItemReader<Customer> reader = new StaxEventItemReader<>();

    reader.setResource(new ClassPathResource("/data/file.xml"));
    reader.setFragmentRootElementName("file");
    reader.setUnmarshaller(unmarshaller);


    return reader;
}

关于java - 如何在 Spring Batch 中使用 StaxEventItemReader 处理复杂的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42943280/

相关文章:

java - Spring MVC Hibernate 创建名为 'sessionFactory' 的 bean 时出错

java - 如何配置 Spring Controller 和/或 JAXB 以帮助防止 SQL/XSS 注入(inject)

jaxb - @XmlPath (".") 与@XmlAdapter 冲突

java - android http 请求的未知主机异常应返回 XML

java - 用 Java 替换大型文本文件中所有特殊字符和数字的有效方法

java - 检查finally中是否执行了try或执行了catch

java - 如何在解码之前了解架构

重复代码的Java通用方法/函数

java - Angular 从 Spring RestController 获取图像并缓存它

java - 如何使用 Hibernate Validator 动态解析消息参数?