快速从XML

时间:2017-01-09 21:41:18

标签: java xml saxparser stax vtd-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解析器进行实现,但需要将近一天的时间来解析80,000 xml。

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;
    }
}

1 个答案:

答案 0 :(得分:0)

这是我的代码mod,它编译xpath一次并重复使用多次。它编译xpath而不绑定到VTDNav实例。它在退出解析方法之前也会调用resetXPath。但是,我没有告诉你如何使用VTD预先索引xml文档...以避免重复解析....我怀疑它可能是你的差异制造者project ...这是关于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("/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;
        }
}