2016-03-11 97 views
0
<RmtInf> 
    <Strd> 
     <RfrdDocInf> 
      <Tp> 
       <CdOrPrtry> 
        <Cd>CINV</Cd> 
       </CdOrPrtry> 
      </Tp> 
      <Nb>3501870</Nb> 
     </RfrdDocInf> 
     <RfrdDocInf> 
      <Tp> 
       <CdOrPrtry> 
        <Prtry>AGJ</Prtry> 
       </CdOrPrtry> 
      </Tp> 
      <Nb>10090187000155438</Nb> 
     </RfrdDocInf> 
     <RfrdDocAmt> 
      <DuePyblAmt Ccy="SEK">5453.29</DuePyblAmt> 
     </RfrdDocAmt> 
    </Strd> 
    <Strd> 
     <RfrdDocInf> 
      <Tp> 
       <CdOrPrtry> 
        <Cd>CINV</Cd> 
       </CdOrPrtry> 
      </Tp> 
      <Nb>160120</Nb> 
     </RfrdDocInf> 
     <RfrdDocInf> 
      <Tp> 
       <CdOrPrtry> 
        <Prtry>AGJ</Prtry> 
       </CdOrPrtry> 
      </Tp> 
      <Nb>10090187000155438</Nb> 
     </RfrdDocInf> 
     <AddtlRmtInf>/ARI/</AddtlRmtInf> 
    </Strd> 
</RmtInf> 
while (ap.evalXPath() != -1) 
    { 
    if (vn.toElement(VTDNav.FIRST_CHILD, "AmtDtls")) { 

    do { 
     amtDetails = getXpathValue(vn, ".//TxAmt/Amt/text()"); 
     // System.out.println("amtDetails:::" + amtDetails); 
     if (amtDetails != null) 
      creditNotification.setAmount(new BigDecimal(amtDetails)); 
    } while (vn.toElement(VTDNav.NEXT_SIBLING, "AmtDtls")); 

    } 

     vn.push(); 

     // System.out.println("transIndex::" + transIndex); 
     ap1.selectXPath("/Document/BkToCstmrDbtCdtNtfctn/Ntfctn/Ntry/NtryDtls/TxDtls[" + transIndex 
       + "]/RmtInf/Strd"); 

     while (ap1.evalXPath() != -1) { 
      // System.out.println("sCount::::"+sCount); 
      custInvType = getXpathValue(vn, "RfrdDocInf[1]/Tp/CdOrPrtry/Cd/text()"); 
      // System.out.println("custInvType:::" + custInvType); 
      creditNotificationFlag = false; 
      if (custInvType != null 
        && custInvType.equalsIgnoreCase(IBS2BankConstants.TYPE_DEBITCREDITNOTIFICATION_CINV)) { 
       kidNmbr = getXpathValue(vn, "RfrdDocInf[1]/Nb/text()"); 
       // System.out.println("\tskidNmbr::::" + kidNmbr); 
       // added as an required by IBS team 
       creditNotification.setMemo3(kidNmbr); 

       if (kidNmbr != null) { 
        creditNotification.setKid(kidNmbr); 

        if (kidNmbr.matches("^\\d{18}")) { 
         creditNotification 
           .setCustomerNumber(IBS2BankUtility.getKidsCustomerNumber(kidNmbr)); 

         // logger.debug("custNumber:::" + 
         // custNumber); 
         creditNotification.setInvoiceNumber(IBS2BankUtility.getKidsInvoiceNumber(kidNmbr)); 
         // logger.debug("custInvoice:::" + 
         // custInvoice); 
        } else if (kidNmbr.matches("^\\d{10}")) { 

         creditNotification.setInvoiceNumber(IBS2BankUtility.getKidsInvoiceNumber(kidNmbr)); 

        } 
       } 

      } 

      String prtryCodeType = getXpathValue(vn, "RfrdDocInf[2]/Tp/CdOrPrtry/Prtry/text()"); 
      // System.out.println("prtryCodeType :::" + 
      // prtryCodeType); 
      if (prtryCodeType != null 
        && prtryCodeType.equalsIgnoreCase(IBS2BankConstants.PROPRIETARY_CODE_AGJ)) { 
       // added as an required by IBS team 
       creditNotification.setMemo4(getXpathValue(vn, "RfrdDocInf[2]/Nb/text()")); 
      } 

      credNotificationList.add(creditNotification); 

     } 
     ap1.resetXPath(); 

     vn.pop(); 

    } 

我已經更新了XML和代碼推送(文本)是用於保存當前位置的狀態,第二個同時使用,因爲RmtInf有多個Strd,我想遍歷它。現在上面的代碼工作,但它需要花費大量的時間來解析XML文件大小爲600 MB。VTD-XML獲得子節點和元素

+0

請編輯您發佈的,而不是增加額外的信息發表評論。 – hotzst

+0

你可以編輯你的文章,讓我更容易看到你的java代碼嗎? –

+0

由於您正在使用vtd-xml擴展,您是否擁有一個巨大的文檔(即大於2 GB)? –

回答

0

首先,你的文檔的嵌套層次非常深,如果你做了大量的xpaths,我建議你打開VTDGen設置的LC層次方法並將其設置爲5(默認值爲3)...

由於您的文檔顯着小於2GB的限制,請考慮切換到標準的vtd-xml(您是否有大約1GB的內存?)。儘管它沒有內存映射功能,但它更適合性能。

要選擇較深的指數水平,稱之爲VTDGen的selectLcDepth(int i)以令i爲5

我注意到另一件事是,在你的代碼

​​

我建議你移動在xpath評估循環中選擇xpath表達式邏輯,然後在循環之前的代碼中執行xpath編譯...並且它看起來像...

Autopilot ap_temp = new AutoPilot(vn); 
    ap_tmp.selectXPath("..//TxAmt/Amt/text()"); 
    ... 
    int i=-1; 
    while((i=ap.evalXPath())!=-1){ 

     ... 
     //amtDetails = getXpathValue(vn, ".//TxAmt/Amt/text()"); will be replaced by 
     amtDetails = getXpathValue(vn, ap_temp); 

此外,如果amtDetails是一個字符串,可以像evalXPathToString()直接就可以輸出直接轉換爲字符串...

你的代碼有多種selectXPath,我懷疑殺死的表現,你應該嘗試採取他們跳出循環......

我寫了一篇關於這一段時間回來了博客.. .https://ximpleware.wordpress.com/2015/10/12/performance-tuning/

push和pop的立場似乎是錯誤的。具體來說,push()應該先於主邏輯中的代碼立即...我非常驚訝你的代碼按照你的指示工作...

你是否注意到你有兩個巨大的XPath評估循環嵌套在每個其他??這看起來不太好...

總的來說,我認爲你已經創建了一個代碼,旨在非常非常低效地運行。

這是我現在的建議...

期待您的想法和意見。

爲了使代碼正常工作,您需要在循環中使用vtd-xml光標...我假定您也知道您需要在while循環內維護節點位置,以免影響正確性XPath求...

你的代碼可能會是這個樣子......

VTDNav vn = vg.getNav(); 
... 
while (ap.evalXPath() != -1) { 

    if (vn.toElement(VTDNav.FIRSTCHILD)){ 
       System.out.println(" node name ===>"+vn.toRawString(vn.getCurrentIndex())); 
       vn.toElement(VTDNav.PARENT); 
    } 
} 
+0

我已添加的代碼,請你看看我在哪裏得到錯誤@ vtd-xml - 作者 –

+0

我們如何添加VTDGen的LC液位方法 –

+0

由於您正在使用擴展vtd-xml該選項不可用。你做得很好,但你還沒有回答我的一些問題...... –