我正在使用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循环中加入。
答案 0 :(得分: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或其他东西没有正确刷新。