2016-03-11 98 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该选项不可用。你做得很好,但你还没有回答我的一些问题...... –