5

我已经开始在 Java 中使用 VTD(我猜是 VTD-XML),对于 XPath 读取它非常好。我现在遇到的问题是插入数据。可以说我正在执行以下操作:

VTDNav nav = preExistingGen.getNav();
AutoPilot pilot = new AutoPilot(nav);
pilot.selectXPath("/Something/SomethingElse");
if (pilot.evalXPath() != -1) {
  XMLModifier modifier = new XMLModifier(nav);
  modifier.insertAfterElement("<some>content</some>");
}

我原本以为这是一个实时更新,它会反映在 VTDNav 中。看起来我的理解是不正确的,因为简单地插入元素内容对导航没有任何作用(如果我输出 VTDNav,它仍然包含我的原始 xml)。我似乎可以处理新 xml 的唯一方法是从 XMLModifier 输出它。

modifier.outputAndReparse(); // Gives me a new VTDNav with the new content

我在这里缺少什么吗?有没有更简单的方法来做到这一点?我希望能够插入新内容,然后立即获取新索引。我现有的代码(使用标准的 DOM 类)有大量的插入和更新,我还需要知道最后一个插入的元素在文档中的位置。每次都必须 outputAndReparse() 然后找到插入的元素(我什至无法保证)似乎不是一个合理的解决方案。

4

2 回答 2

2

我认为答案是仔细计划您的修改和随后对新内容的访问。如果您插入新内容,然后尝试立即访问新内容,则 insertAndParse() 是要走的路。但是正如您所看到的,由于重新解析,它相当慢。我的建议是你计划一次全部插入,然后只调用一次重新解析,这样会更有效率。

精神是VTD-XML不是试图成为DOM,它有自己的优点和缺点......这是缺点之一,但你可以解决它......当你尝试合并多个xml文件时, vtd-xml 一定会大放异彩....

此外,如果您使用 vtd-xml 标记此问题,我将能够更轻松地找到它。

于 2013-01-12T22:25:27.117 回答
0
modifier.remove():

在文本文件中存储了 no.of xpaths, val 所以为每个 xpath 生成一个新的输出 xxx.xml 文件。当您使用 xml 修饰符以前的数据和当前数据时,它将写入 xxx.xml 文件,以便消除以前的数据,并且仅针对当前 xpath 数据更改写入新的 xxx.xml 文件,因此使用修饰符.remove( );

xm2.output( new FileOutputStream("/home/cupola-hadoop-project/TotalEnvironment/document/link/"+j+"101new.xml"));
xm2.remove();

并旋转循环所需的次数。

于 2011-10-17T13:17:54.900 回答