2017-01-09 55 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 –