1

我正在使用 VTD-XML 将大型 xml 文件拆分为较小的 xml 文件。一切正常接受:

autoPilot.selectXPath("//nodeName")

由于某种原因,它跳过了前 3 个节点。

编辑:vtd-xml-author 指出LOG.info("xpath has found "+ ap.evalXPath() +" items");不返回计数但返回节点索引。

新的拆分 xml 文件缺少原始文件中的前三个节点。

这是基本的 XML 布局。我无法显示真正的 xml 数据,但它看起来像这样:

<rootNode>
          <parentNode>
                      <contentNode>..children inside...</contentNode>
                      <contentNode>..children inside...</contentNode>
                      <contentNode>..children inside...</contentNode>
                      <contentNode>..children inside...</contentNode>
          </parentNode>
</rootNode>

这是我用来拆分 xml 的函数:

public void splitXml(String parentNode, String contentNodes)throws Exception {
    LOG.info("Splitting " + outputName + parentNode);
    VTDGen vg = new VTDGen();   

     if (vg.parseFile(xmlSource, true)){

        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("//"+contentNode);

        int i=-1;
        int k=0;
        byte[] ba = vn.getXML().getBytes();
        FileOutputStream fos = getNewXml(parentNode);
        while((i=ap.evalXPath())!=-1){

            if(fos.getChannel().size() > maxFileSize){
                finishXml(fos,contentNode);
                LOG.info("Finished file with " + k + "nodes");
                fos = getNewXml(contentNode);
                k=0;
            }
            k++;
            long l = vn.getElementFragment();
            fos.write(ba, (int)l, (int)(l>>32));
            fos.write("\n".getBytes());
        }
        finishXml(fos,contentNode);
        LOG.info("Finished Splitting " + outputName + " " + parentNode + " with " +k+ " nodes");
    } else {
        LOG.info("Parse Failed");
    }


}

编辑:添加到 while 循环的计数器中。

4

1 回答 1

1

正如vtd-xml-author建议的那样,我在计数器中添加了 while 循环。

        while((i=ap.evalXPath())!=-1){
            // if filesize is at max create a new File
            if(fos.getChannel().size() > maxFileSize){
                finishXml(fos,contentNode);
                LOG.info("Finished file with " + k + "nodes");
                fos = getNewXml(contentNode);
                k=0;

            }
            k++;
            long l = vn.getElementFragment();
            fos.write(ba, (int)l, (int)(l>>32));
            fos.write("\n".getBytes());
        }

我第一次运行它时,输出只丢失了 1 条记录。然后我删除了输出 xml 文件和文件夹,并重新运行了拆分器。这次它在日志中返回了正确的编号并正确拆分了文件。我多次重复该过程,同时删除创建的文件夹和文件,也没有删除文件。我每次都得到相同的正确结果。我猜 IDE 或其他东西没有正确刷新。

于 2012-10-30T22:13:16.287 回答