2017-01-09 71 views
0

檢索數據的我示例XML快速從XML

<?xml version="1.0" encoding="UTF-8"?> 
    <tag_1> 
    <tag_2>A</tag_2> 
    <tag_3>B</tag_3> 
    <tag_4>C</tag_4> 
    <tag_5>D</tag_5> 
    </tag_1> 
</xml> 

現在我很感興趣,只提取特定的數據。

例如

tag_1/tag_5 -> D 

tag_1/tag_5是我的數據定義在本質上是動態的(其中我想的唯一數據),這意味着明天TAG_1/tag_4將是我的數據定義。

因此,在現實我的XML是一個大的數據集。而這些XML有效載荷就像50,000 /小時到80,000 /小時。

我想知道是否有已經高性能XML閱讀器工具或某些特殊的邏輯,我可以實現這取決於數據定義中提取數據。

目前我有執行使用StAX解析器,但其每天近服用解析XML 80000分的。

public class VTDParser { 

    private final Logger LOG = LoggerFactory.getLogger(VTDParser.class); 

    private final VTDGen vg; 

    public VTDParser() { 
     vg = new VTDGen(); 
    } 

    public String parse(final String data, final String xpath) { 
     vg.setDoc(data.getBytes()); 
     try { 
      vg.parse(true); 
     } catch (final ParseException e) { 
      LOG.error(e.toString()); 
     } 

     final VTDNav vn = vg.getNav(); 
     final AutoPilot ap = new AutoPilot(vn); 
     try { 
      ap.selectXPath(xpath); 
     } catch (final XPathParseException e) { 
      LOG.error(e.toString()); 
     } 

     try { 
      while (ap.evalXPath() != -1) { 
       final int val = vn.getText(); 
       if (val != -1) { 
        return vn.toNormalizedString(val); 
       } 
      } 
     } catch (XPathEvalException | NavException e) { 
      LOG.error(e.toString()); 
     } 
     return null; 
    } 
} 
+0

不知道爲什麼我得到-1。我不清楚嗎?我只是在尋找想法,而不是要求某人爲我實施。 –

+0

50-80,000 /小時,即每秒20個。如果你只工作單線程,那意味着一個xml的1/20秒。如果xml文件的大小如你所說,你永遠無法在0.05秒內解析它,尤其是當它們可能是你可能無法控制的其他開銷(例如讀取xml文件時的網絡/磁盤延遲)。所以爲了達到你的目標,你首先需要平行工作。然後可能考慮將數據放入數據庫以便查詢,因此當您的查詢明天發生變化時,您不必重新解析所有文檔。但數據庫也需要計劃 – cello

+0

是的,先生。其實我最終使用Vtd-Xml實現。我也渴望聽到你的答案。 –

回答

0

這是我的代碼,它編譯xpath一次並重復使用很多次。它編譯xpath而不綁定到VTDNav實例。它也在退出解析方法之前調用resetXPath ..但是,我沒有告訴你如何用VTD預編譯xml文檔...以避免重複解析....並且我懷疑它可能是您的差異製造商項目......這是關於VTD-XML的功能的紙參考..

http://recipp.ipp.pt/bitstream/10400.22/1847/1/ART_BrunoOliveira_2013.pdf

import com.ximpleware.*; 


public class VTDParser { 
     // private final Logger LOG = LoggerFactory.getLogger(VTDParser.class); 

     private final VTDGen vg; 
     private final AutoPilot ap; 
     public VTDParser() throws VTDException{ 
      vg = new VTDGen(); 
      ap = new AutoPilot(); 
      ap.selectXPath("https://stackoverflow.com/a/b/c");// this is how you compile xpath w/o binding to an XML doc 
     } 

     public String parse(final String data, final AutoPilot ap1) { 
      vg.setDoc(data.getBytes()); 
      try { 
       vg.parse(true); 
      } catch (final ParseException e) { 
       LOG.error(e.toString()); 
      } 

      final VTDNav vn = vg.getNav(); 
      ap1.bind(vn); 
      try { 
       while (ap.evalXPath() != -1) { 
        final int val = vn.getText(); 
        if (val != -1) { 
         return vn.toNormalizedString(val); 
        } 
       } 
      } catch (XPathEvalException | NavException e) { 
       LOG.error(e.toString()); 
      } 
      ap.resetXPath();// reset your xpath here 
      return null; 
     } 
} 
+0

以上的代碼中重用xpath和VTDgen謝謝。我不明白爲什麼我們通過AutoPilot ap1作爲paramter來解析,而不是被稱爲綁定(vn) –

+0

這是因爲您想重用xpath表達式...對嗎?如果你傳遞一個字符串,這是不能再次使用... –

+0

添加一個文件引用vtd-xml –