【问题标题】:How can you save the constant update and the finally save the output as a file with XMLModifier如何保存不断更新并最终使用 XMLModifier 将输出保存为文件
【发布时间】:2015-12-17 03:32:33
【问题描述】:

我有不同的方法尝试根据路径更新/删除元素/令牌。

现在,每个方法,在编辑完成后,直接保存为文件,

VTDGen vg = new VTDGen();
vg.parseFile("input.xml", false);
vn.getNav();
AutoPilot ap = new AutoPilot(vn);  
XMLModifier xm; 

public void updateToken(String path)
{
    xm = new XMLModifier(vn);
    ap.selectXPath(path);
    ......
    xm.updateToken(i,"hello");
    ......
    xm.output("output.xml");
}

如果我继续再次调用此方法,它确实会保存,但它会用新的更改覆盖文件,我不希望这样,那我该怎么做呢?

我也尝试过使用

xm.outputAndReparse();

我将更新保存回NTDNav vn,并重复使用其余方法,但它破坏了方法的其余部分移动到节点(使用 AutoPilot)。

我想要的:根据路径调用更新token的方法,保存更新,用另一个路径再次调用方法,最后更新完成后,保存到文件中。

如果我有任何错误,请告诉我,因为我还是 VTD-XML 的新手。谢谢。


得到它的工作,这就是我所做的。

VTDGen vg = new VTDGen();
vg.parseFile("input.xml", false);
vn.getNav();
AutoPilot ap = new AutoPilot(vn);
XMLModifier xm = new XMLModifier(vn);

public void output()
{
   ....       
   xm.output("output.xml");
   ....
}

public void updateToken(String path) 
{
    ap.selectPath(path);
    .........
    xm.updateToken(i,"hello");
}

【问题讨论】:

  • 您是否尝试将每个更新保存到一个单独的文件中(每个 xpath 一个 output.xml)?或者,您是否尝试将每个基于路径的更新应用到同一个文件并将所有更新聚合到一个输出中?
  • @vtd-xml-author 第二个选项。示例 - 如果我有 2 个要更新的路径,我调用第一个方法,返回更新后的版本,然后去更新第二个路径,然后完成后,所有输出都将在单个文件上。
  • 简短的回答是:将“xm.output()”从updateToken方法中取出并放入main方法中,在你调用了所有updateToken方法之后..我会写一个更详细的描述作为对您问题的正式答复...

标签: java xml vtd-xml


【解决方案1】:

XMLModifier 是一组实现 VTD-XML 独特的增量更新功能的方法。

要更新 XML 的内容,您首先必须将 VTDNav 的实例附加到 XMLModifier 对象。您可以对 XML 文档应用三种类型的操作:删除、插入和更新(同时删除和插入)。

XMLModier 最重要的概念是

  1. 每个偏移值一次操作:在相同偏移处重复两次操作会导致异常。
  2. 不会立即兑现任何内容更改:它只是标记更改并在 XMLModifier 内部保留它的记录。输出 XML 仅通过调用 output() 方法生成。
  3. VTDNav 对象中包含的原始输入 XML 文档保持不变。

因此,基本上,您可以根据需要标记任意数量的更改,但您需要明确要求将这些更改推送到输出。输入 XML 没有变化。

所以我认为您需要将 output() 方法从 updateToken 方法中移出,而是在所有 updateToken 调用之后在更高级别的过程中调用它。换句话说,您的 updateToken() 应该只标记更改,而不是推送到输出。

另一个相关点:您可以通过调用 XMLModifier 的 reset() 方法删除所有标记。这将帮助您重用 XMLModifier 将一组新的操作应用于输入文档。

关于 outputAndParse() 的目的,基本上是为了减少输出一个新文档然后立即解析它的编码工作量。但是这种方法有一个缺点,因为它是一种相对缓慢/繁重的调用方法。所以考虑谨慎使用它。如果您尝试对文档内容应用多批更改,请在调用 outputAndParse() 之前一次性完成。

【讨论】:

  • 感谢您的澄清,很好的解释。第 2 点和第 3 点很有趣;最初,我认为我必须保存所有更新,因为我认为这是一次更新/删除(这意味着如果我再次调用 xm.updateToken(i, "hello"),它将重置或替换)。
  • 所以我看到一些使用xm.outputAndReparse(); 所以我在想,是不是我必须将它返回给VTDNav vn,它看起来像这样 - setVTDNav(VTDNav nv) { this.vn = vn;} setVTDNav(xm.outputAndReparse()); 然后每当我使用xm它会记得......你介意澄清xm.outputAndReparse();的用法
猜你喜欢
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
相关资源
最近更新 更多