2016-05-04 78 views
0

这是服务类。我通过读取数据库中的值来创建XML文件。代码使用三个pojo类。 Mt700,Header和Swift细节。 MT700是Header和快速细节的主要类。问题是我能够一次存储所有内容。使用一条记录生成文件时,具有多少行数据并不重要,它只有一个标题和一个快速详细信息。我怎样才能使这项工作循环?我想我必须使用列表,但我不知道如何使用它来使其工作。从Java创建XML文件jaxB

public void generateEliteExtracts(int trdCustomerKy, Date lastRunDate, Date currentDate) throws TradeException { 
      FileOutputStream fout = null; 
      try { 

          MT700 mt700 = getMT700(trdCustomerKy,lastRunDate,currentDate); 
          if (null != mt700){ 
          StringBuffer fileName = new StringBuffer(1024); 
          fileName.append(mConfiguration.getOutDirectory()).append(MT700_MSGTYPE) 
            .append(DOT).append(mConfiguration.getOutputFileExtn()); 
          smLog.debug("Generated Extract for BankRef" + fileName.toString()); 
          mTracer.log("Generated Extract for BankRef" + fileName.toString()); 
          File xmlFile = new File(fileName.toString()); 
          fout = new FileOutputStream(xmlFile); 
          fout.write(MT700_XMLHEADER.getBytes()); 
          JAXBContext jaxbContext = JAXBContext.newInstance(MT700.class); 
          Marshaller marshaller = jaxbContext.createMarshaller(); 
          marshaller.setProperty(Marshaller.JAXB_ENCODING, ENCODING_ASCII); 
          marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
          marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE); 
          marshaller.setProperty("com.sun.xml.internal.bind.xmlDeclaration", Boolean.FALSE); 
          marshaller.marshal(mt700, fout); 
          IOUtils.closeQuietly(fout); 
          } 
     }catch(

     Exception ex) 

     { 
      smLog.error("Caught unexpected error while creating extracts. ", ex); 
      throw new TradeException("Caught unexpected error while creating extracts.", ex); 
     } finally 

     { 
      IOUtils.closeQuietly(fout); 
     } 

     } 

     private MT700 getMT700(int trdCustomerKy, Date lastRunDate, Date currentDate) throws TradeException { 
      MT700 mt700 = new MT700(); 

      AbInBevEliteExtractDAO dao = new AbInBevEliteExtractDAO(mConnection); 
      CompanyCodesHelper ccHelper = new CompanyCodesHelper(mConnection); 
      String cifCodes = ccHelper.getDescription(trdCustomerKy, "CIF Codes", "CIF Codes"); 
      if (false == TradeUtil.isStringNull(cifCodes)) { 
       mTracer.log("Fetching records for CIFs: " + StringUtils.replace(cifCodes, PIPE, COMMA)); 
       String[] codes = StringUtils.split(cifCodes, PIPE); 
       List<ExportAdvicesData> exportList = dao.getExportAdvices(trdCustomerKy, lastRunDate, currentDate, codes); 
       for (int i = 0; i < exportList.size(); i++) { 

        ExportAdvicesData exportData = exportList.get(i); 

        if ("XXLC".equalsIgnoreCase(exportData.getDocAcronym())) { 
         Header header = new Header(); 
         header.setMessageType("N"); 
         header.setVersionNo("1.0"); 
         header.setRevisionNo("00"); 
         header.setDocumentDate(DateUtil.formatDate(new Date(), DATE_FORMAT_YYYY_MM_DD_HHMMSS)); 
         header.setBankId("BOA" + StringUtils.substring(exportData.getCustRef(), 0, 4)); 
         header.setCustId("XOM"); 
         SwiftDetails swiftTest = new SwiftDetails(); 
         header.setDocumentType(MT700_MSGTYPE); 

         SwiftParserBankDocs parser = new SwiftParserBankDocs(exportData.getDocumentContent()); 

         String bankRef = parser.getTagValue("21"); 
         String custRef = parser.getTagValue("20"); 

         if (TradeUtil.isStringNull(bankRef)) { 
          header.setCustRefNo("NONREF"); 
          header.setBankRefNo(custRef); 
         } else { 
          header.setCustRefNo(custRef); 
          header.setBankRefNo(bankRef); 
         } 

         swiftTest.setTAG_27("1/1"); 
         swiftTest.setTAG_20(custRef); 
         swiftTest.setTAG_23(EMPTY_STRING); 
         String issueDate = parser.getTagValue("31C"); 
         swiftTest.setTAG_31C(getDateInYYMMDD(issueDate)); 
         swiftTest.setTAG_40E("UCP LATEST VERSION"); 
         String datePlaceOfExpiry = parser.getTagValue("31D"); 
         swiftTest.setTAG_31D(getFormattedDatePlaceOfExpiry(datePlaceOfExpiry)); 
         swiftTest.setTAG_50(parser.getTagValue("50")); 
         swiftTest.setTAG_59(parser.getTagValue("59")); 
         swiftTest.setTAG_32B(getCurrencyCdAmount(parser.getTagValue("32B"))); 
         if (false == TradeUtil.isStringNull(exportData.getPositiveTolerance())) { 
          swiftTest.setTAG_39A(
            exportData.getPositiveTolerance() + "/" + exportData.getPositiveTolerance()); 
         } else { 
          swiftTest.setTAG_39A(EMPTY_STRING); 
         } 
         swiftTest.setTAG_39B(EMPTY_STRING); 
         swiftTest.setTAG_39C(EMPTY_STRING); 
         swiftTest.setTAG_41A(parser.getTagValue("41D")); 
         String tag42A = parser.getTagValue("42A"); 
         swiftTest.setTAG_42A(tag42A); 
         if (TradeUtil.isStringNull(tag42A)) { 
          swiftTest.setTAG_42A(parser.getTagValue("42D")); 
         } 

         swiftTest.setTAG_42C(parser.getTagValue("42C")); 
         swiftTest.setTAG_42M(parser.getTagValue("42M")); 
         swiftTest.setTAG_42P(parser.getTagValue("42P")); 
         swiftTest.setTAG_43P(parser.getTagValue("43P")); 
         swiftTest.setTAG_43T(parser.getTagValue("43T")); 

         if (!(TradeUtil.isStringNull(parser.getTagValue("44A")))) { 
          swiftTest.setTAG_44A(parser.getTagValue("44A")); 
         } 

         if (!(TradeUtil.isStringNull(parser.getTagValue("44B")))) { 
          swiftTest.setTAG_44B(parser.getTagValue("44B")); 
         } 

         if (!(TradeUtil.isStringNull(parser.getTagValue("44E")))) { 
          swiftTest.setTAG_44E(parser.getTagValue("44E")); 
         } 

         if (!(TradeUtil.isStringNull(parser.getTagValue("44F")))) { 
          swiftTest.setTAG_44F(parser.getTagValue("44F")); 
         } 

         Date latestShipDate = exportData.getLatestShipDate(); 
         if (null != latestShipDate) { 
          swiftTest.setTAG_44C(DateUtil.formatDate(latestShipDate, DATE_FORMAT_YYMMDD)); 
         } else { 
          swiftTest.setTAG_44C(EMPTY_STRING); 
         } 
         swiftTest.setTAG_44D(parser.getTagValue("44D")); 

         swiftTest.setTAG_45A(parser.getTagValue("45") + BLANK_STRING + parser.getTagValue("45A") 
           + BLANK_STRING + parser.getTagValue("45B")); 
         swiftTest.setTAG_46A(parser.getTagValue("46") + BLANK_STRING + parser.getTagValue("46A") 
           + BLANK_STRING + parser.getTagValue("46B")); 
         swiftTest.setTAG_47A(parser.getTagValue("47") + BLANK_STRING + parser.getTagValue("47A") 
           + BLANK_STRING + parser.getTagValue("47B")); 
         swiftTest.setTAG_71B(parser.getTagValue("71B")); 
         swiftTest.setTAG_48(parser.getTagValue("48")); 
         swiftTest.setTAG_49(parser.getTagValue("49")); 
         swiftTest.setTAG_50B(EMPTY_STRING); 
         swiftTest.setTAG_51A(EMPTY_STRING); 

         String issuingBank = parser.getAddress(SwiftParserBankDocs.ISSUING_BANK); 
         if (TradeUtil.isStringNull(issuingBank)) { 
          String errorMsg = "Issuing Bank address not found in bankdoc text, SWIFT content is possibly invalid, skipped processed record: " 
            + exportData.getCustRef(); 
          smLog.error(errorMsg); 
          mTracer.log("ERROR: " + errorMsg); 

         } 
         issuingBank = StringUtils.replace(issuingBank, CRLF, BLANK_STRING + CRLF); 
         swiftTest.setTAG_52A(issuingBank); 
         swiftTest.setTAG_53A(parser.getTagValue("53A")); 
         swiftTest.setTAG_78(parser.getTagValue("78")); 
         swiftTest.setTAG_57A(parser.getAddress("TO:")); 
         swiftTest.setTAG_72(parser.getTagValue("72")); 
         swiftTest.setTAG_40A(parser.getTagValue("40B")); 
         if (parser.is710Advice()) { 
          swiftTest.setTAG_20(parser.getTagValue("21")); 

         } 
         mt700.setSwift700(swiftTest); 
         mt700.setHeader(header); 
        } else if ("XAMD".equalsIgnoreCase(exportData.getDocAcronym())) { 
         Header header = new Header(); 
         header.setMessageType("N"); 
         header.setVersionNo("1.0"); 
         header.setRevisionNo("00"); 
         header.setDocumentDate(DateUtil.formatDate(new Date(), DATE_FORMAT_YYYY_MM_DD_HHMMSS)); 
         header.setBankId("BOA" + StringUtils.substring(exportData.getCustRef(), 0, 4)); 
         header.setCustId("XOM"); 
         SwiftDetails swift = new SwiftDetails(); 
         header.setDocumentType(MT707_MSGTYPE); 
         SwiftParserBankDocs parser = new SwiftParserBankDocs(exportData.getDocumentContent()); 

         String custRef = parser.getTagValue("20"); 
         String bankRef = parser.getTagValue("23"); 

         if (TradeUtil.isStringNull(bankRef)) { 
          header.setBankRefNo("NONREF"); 
         } else { 
          header.setBankRefNo(bankRef); 
         } 
         header.setCustRefNo(custRef); 
         swift.setTAG_20(custRef); 
         swift.setTAG_21(parser.getTagValue("21")); 
         swift.setTAG_23(EMPTY_STRING); 
         String issuingBank = parser.getAddress(SwiftParserBankDocs.ISSUING_BANK); 
         if (TradeUtil.isStringNull(issuingBank)) { 
          String errorMsg = "Issuing Bank address not found in bankdoc text, SWIFT content is possibly invalid, skipped processed record: " 
            + exportData.getCustRef(); 
          smLog.error(errorMsg); 
          mTracer.log("ERROR: " + errorMsg); 
          swift.setTAG_52A(EMPTY_STRING); 
         } else { 
          issuingBank = StringUtils.replace(issuingBank, CRLF, BLANK_STRING + CRLF); 
          swift.setTAG_52A(issuingBank); 
         } 
         swift.setTAG_31C(getDateInYYMMDD(parser.getTagValue("31C"))); 
         swift.setTAG_30(getDateInYYMMDD(parser.getTagValue("30"))); 
         swift.setTAG_26E(parser.getTagValue("26E")); 
         swift.setTAG_59(parser.getTagValue("59")); 
         swift.setTAG_31E(getDateInYYMMDD(parser.getTagValue("31E"))); 
         swift.setTAG_79(parser.getTagValue("79")); 
         swift.setTAG_72(parser.getTagValue("72")); 
         swift.setTAG_32B(getCurrencyCdAmount(parser.getTagValue("32B"))); 
         swift.setTAG_33B(getCurrencyCdAmount(parser.getTagValue("33B"))); 
         swift.setTAG_34B(getCurrencyCdAmount(parser.getTagValue("34B"))); 
         swift.setTAG_39A(parser.getTagValue("39A")); 
         swift.setTAG_39B(parser.getTagValue("39B")); 
         swift.setTAG_39C(parser.getTagValue("39C")); 
         swift.setTAG_44A(parser.getTagValue("44A")); 
         swift.setTAG_44B(parser.getTagValue("44B")); 
         swift.setTAG_44C(parser.getTagValue("44C")); 
         swift.setTAG_44D(parser.getTagValue("44D")); 
         swift.setTAG_44E(parser.getTagValue("44E")); 
         swift.setTAG_44F(parser.getTagValue("44F")); 
         mt700.setHeader(header); 
         mt700.setSwift700(swift); 
        } 


       } 
      } 
      return mt700; 
     } 

这是MT700 POJO类。在这个类中,我调用了头文件和快速详细pojo类。

@XmlRootElement(name = "MT700") 
    public class MT700 implements Serializable 
    { 

     /** 
     * serialVersionUID 
     */ 
     private static final long serialVersionUID = 1L; 

     private Header header; 
     private SwiftDetails swift700; 

     private String version = "1.0"; 

     public Header getHeader() 
     { 
      return header; 
     } 

     @XmlElement(name = "Header") 
     public void setHeader(Header header) 
     { 
      this.header = header; 
     } 

     /** 
     * @return the swift700 
     */ 
     public SwiftDetails getSwift700() 
     { 
      return swift700; 
     } 

     @XmlElement(name = "Swift_Details_700") 
     public void setSwift700(SwiftDetails swift700) 
     { 
      this.swift700 = swift700; 
     } 

     public String getVersion() 
     { 
      return version; 
     } 


     @XmlAttribute(name = "Version") 
     public void setVersion(String version) 
     { 
      this.version = version; 
     } 

    } 

这是标头类。类似的I类喜欢这其中有标签,那就是迅速细节

@XmlRootElement(name = "Header") 
    @XmlType(propOrder = { "documentType", "messageType", "versionNo", 
      "revisionNo", "documentDate", "bankId", "custId", "custRefNo", 
      "bankRefNo" }) 
    public class Header implements Serializable 
    { 

     private static final long serialVersionUID = 1L; 

     private String documentType; 
     private String messageType; 
     private String versionNo; 
     private String revisionNo; 
     private String documentDate; 
     private String bankId; 
     private String custId; 
     private String custRefNo; 
     private String bankRefNo; 

我不添加getter和setter该类使后看起来简单

回答

0

你正在创建一个MT700实例,然后在这个循环中,你是通过循环重新分配头和迅速的领域,每次:

MT700 mt700 = new MT700(); 
for (int i = 0; i < exportList.size(); i++) { 
    ... 
    mt700.setHeader(header); 
    mt700.setSwift700(swift); 
} 

这意味着你在输出文件只包含从数据库查询返回的最后一个头/快捷。

您需要将这三个中的一个或多个放入某种列表中。无论是你的MT700包含一个标题和swift的列表,或者更可能你想要一个MT700列表,每个都有一个标题和一个swift。

换句话说,你想要第四种类型,它将是你的XML文档的实际根。该元素将为查询找到的每一行包含一个MT700元素。每个MT700元件都有一个标题元素和一个swift元素。

所以,更具体地说,这里是你想做的事:

@XmlRootElement 
class MT700s { 
    @XmlElement(name = "MT700") 
    private List<MT700> mt700s = new ArrayList<>(); 
    public List<MT700> getMT700s() { return mt700s; } 
    // Etc. 
} 

MT700s mt700s = new MT700s(); 
for (int i = 0; i < exportList.size(); i++) { 
    MT700 mt700 = new MT700(); 
    ... 
    mt700.setHeader(header); 
    mt700.setSwift700(swift); 
    mt700s.getMT700s().add(mt700); 
} 
+0

我这样做,现在的文件越来越产生。我有数据,但它不是XML。我创建了LIst。但是,在JAXB我得到错误。似乎JAXB不接受列表.... – Sam

+0

我正是在这种情况。我该怎么办? http://stackoverflow.com/questions/12139996/how-to-convert-arraylistobject-to-a-xml-using-jaxb – Sam

+0

这个问题的答案告诉你到底你想要做什么。我将编辑我的答案以提供更具体的指导。 – Rob