如何在VTD-XML中创建/传递大量AutoPilot对象实例?

时间:2016-08-22 08:09:47

标签: java xml xpath vtd-xml

在我的组织中,我们使用 xslt 1.0和 xpath 1.0来进行大型xml转换。但现在我们需要进行迁移。

我正在使用VTD-XML来解析和转换一个巨大的xml 200MB并且我有超过20个xpath选择,因此对于我想要定义的每一个:

public void  methodCalculate(final VTDNav navigator, final AutoPilot partAutoPilot)

所以我试着将它们放在方法层次结构的顶部而不是for,for-each等等,以便能够花费更少的处理器速度和内存,但是有问题。我想知道如何传递对象,因为:

  1. 简单案例

    public void methodCalculate(final VTDNav navigator, final AutoPilot partAutoPilot, final AutoPilot first,final AutoPilot second,final AutoPilot third,final AutoPilot fourth){
     method3(navigator,first,second,third,fourth);
    }
    public void  method3(final VTDNav navigator,final AutoPilot second,final AutoPilot third,final AutoPilot fourth){
      method2(navigator,second,third,fourth);
     }
    ....
    
  2. 确定一个AutoPilot确定。

    1. MoreComplex案例  methodCalculate调用method3->调用method2->调用方法1

      {{1}}
    2. 并且每个方法都需要使用相对xpath进行子选择,所以我需要传递4个AutoPilots,即使有新的转换规则,其他 method_0 也可以来,我需要添加额外的AutoPilot。 所以我想知道如何在这种情况下进行?如何更有效地传递 AutoObjects ,因为它们消耗大量内存并且计算成本非常高?

      我尝试了什么? 我在调用methodCalulate的方法中从最顶层提取了AutoPilot,因此它们只创建一次。并在methodCalulate中创建其他AutoPilots。它提高了速度,但是在下一个内联调用中,创建AutoPilots可以创建性能地狱。

      编辑: 我可以使用AutoPilots添加List,甚至可以使用map和一个常量类来键搜索适当的AutoPilot以获得给定的select。我不知道这里有什么最好的选择。

1 个答案:

答案 0 :(得分:1)

AutoPilot编译应该在循环外进行...但它不会消耗大量内存...你可以将所有autoPilot对象放在哈希表中并使用xpath字符串作为哈希键...

正如您可能已经注意到的,vtd-xml的xpath评估发生在循环中,这与DOM非常不同。虽然这可能有点难以习惯......但它在实现卓越性能和低内存使用方面有很多优点/好处。

对于简单的xpath,例如那些涉及一个子标记查找的xpath,你可以放弃xpath,而是直接将你的应用程序逻辑基于光标...同样的规则适用:确保光标位置进入一块在离开该代码块时,app逻辑保持不变。

所以你有两个选择:最常见的是push pop()。但是对于简单的子查找,在调用toElement(FirstChild)之后,您只需调用toElement(Parent)返回起始位置。