2016-09-21 86 views
0

我在Spring批處理中使用StaxEventItemReader來讀取XML數據並將其映射到java對象。我能夠閱讀器重複XML中的元素,但問題是我想從我的XML中讀取標題信息。 StaxEventItemReader是否有任何方式或支持來讀取標題信息。如何在Spring批處理中使用StaxEventItemReader讀取頭信息

<?xml version="1.0" encoding="UTF-8"?> 
<Contracts> 
    <TransactionInfo><Receiver> 
      <Code>CAT</Code> 
      <Name>CAT</Name> 
     </Receiver> 
     <SourceFile> 
      <FilePath>\\nft2a\ft$\transfer\EAD7SRR1.20160510_02363859.xml 
      </FilePath> 
      <FileName>EAD7SRR1.20160510_02363859.xml 
      </FileName> 
      <FileType>XML</FileType> 
      <FileTime>2016-05-10T02:36:41.337-07:00 
      </FileTime> 
     </SourceFile> 
    </TransactionInfo> 
    <Contract ContractID="Contract Rate Feed Test - LCL" 
     Carrier="DHL Danzas Air &amp; Ocean" TermBegin="2015-09-15" TermEnd="2016-09-14" 
     CarrierOrgID="20455"> 
     <LineItem ReferenceID="135516504144" Origin="Antwerp, BE" OriginCity="Antwerp" DestinationCity="Kpeme"> 
      <Surcharge Amount="25.0" Basis="BILLADING" Code="CUSTOM" Name="Document Turnover Fee" CurrencyCode="USD" /> 
      <Surcharge Amount="10.0" Basis="KILO" Code="CUSTOM" Name="Hazardous" CurrencyCode="USD" /> 
     </LineItem> 
     <LineItem ReferenceID="135516504145" Origin="Antwerp, BE"OriginCity="Antwerp" DestinationCity="Libreville"> 
      <Surcharge Amount="8.0" Basis="KILO" Code="CUSTOM" Name="Origin Handling" 
       CurrencyCode="USD" /> 
     </LineItem> 
    </Contract> 
    <Contract ContractID="Contract_1005_Test_LCL" 
     GTNContractID="66860" CarrierOrgID="20455"> 
     <LineItem ReferenceID="135516559003" Origin="Hong Kong, HK" DestinationCity="Hamburg"> 
      <Surcharge Amount="10.0" Basis="KILO" Code="ACD" Name="Arbitraries Charge (Destination)" CurrencyCode="USD" /> 
     </LineItem> 
    </Contract> 
</Contracts> 

我怎麼能讀TransactionInfo 我的配置是

<bean id="contractReader" class="org.springframework.batch.item.xml.StaxEventItemReader"> 
<property name="resource" value="classpath:sample-inputfile-srr-ocean.xml" /> 
    <property name="fragmentRootElementName" value="Contract" /> 
    <property name="unmarshaller"> 
     <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
      <property name="classesToBeBound"> 
       <list> 
        <value>com.cat.srr.gtn.domain.Contract</value> 
       </list> 
      </property> 
     </bean> 
    </property> 
</bean> 
<batch:job id="gtnContractJob"> 

    <batch:step id="step1" next="step2"> 
     <tasklet ref="ftpPullTask" /> 
    </batch:step> 

    <batch:step id="step2"> 
     <batch:tasklet transaction-manager="transactionManager"> 
      <batch:chunk reader="multiResourceReader" writer="contractWriter" 
       processor="contractProcessor" commit-interval="10" /> 
     </batch:tasklet> 
    </batch:step> 

    <batch:listeners> 
     <batch:listener ref="jobListener" /> 
    </batch:listeners> 
</batch:job> 

請幫助我,我怎麼能讀取使用Spring Batch的頭信息。

回答

0

使用下面StaxEventItemReader財產

fragmentRootElementNames

所以你contractReader應該是這樣的

<bean id="contractReader" class="org.springframework.batch.item.xml.StaxEventItemReader"> 
<property name="resource" value="classpath:sample-inputfile-srr-ocean.xml" /> 
    <property name="fragmentRootElementNames" value="TransactionInfo,Contract" /> 
    <property name="unmarshaller"> 
     <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
      <property name="classesToBeBound"> 
       <list> 
        <value>com.cat.srr.gtn.domain.Contract</value> 
<!-- Assumed that TransactionInfo is in same package as Contract --> 
        <value>com.cat.srr.gtn.domain.TransactionInfo</value> 
       </list> 
      </property> 
     </bean> 
    </property> 
</bean> 

現在如何處理它的處理器是由你

+0

如何在處理器中檢索這些對象值使用處理器只能有1個對象ItemProcessor ? – Sushil

+0

您可以實現ItemProcessor 和ItemWriter ,並且可以控制要執行的操作。組合項目閱讀器將具有ItemProcessor 和ItemProcessor 的委託。在ItemProcessor中根據Object的類型調用其中一個ItemProcessor委託來決定 –

+0

我嘗試在ItemProcessor中使用Object(ItemProcessor ),但它不起作用。你能否給我一個這種情況下的物品處理器樣品。 ?控制本身不是來ItemProcessor – Sushil

相關問題