在我的组织中,我们使用 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等等,以便能够花费更少的处理器速度和内存,但是有问题。我想知道如何传递对象,因为:
简单案例
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);
}
....
确定一个AutoPilot确定。
MoreComplex案例 methodCalculate调用method3->调用method2->调用方法1
{{1}}
并且每个方法都需要使用相对xpath进行子选择,所以我需要传递4个AutoPilots,即使有新的转换规则,其他 method_0 也可以来,我需要添加额外的AutoPilot。 所以我想知道如何在这种情况下进行?如何更有效地传递 AutoObjects ,因为它们消耗大量内存并且计算成本非常高?
我尝试了什么? 我在调用methodCalulate的方法中从最顶层提取了AutoPilot,因此它们只创建一次。并在methodCalulate中创建其他AutoPilots。它提高了速度,但是在下一个内联调用中,创建AutoPilots可以创建性能地狱。
编辑: 我可以使用AutoPilots添加List,甚至可以使用map和一个常量类来键搜索适当的AutoPilot以获得给定的select。我不知道这里有什么最好的选择。
答案 0 :(得分:1)
AutoPilot编译应该在循环外进行...但它不会消耗大量内存...你可以将所有autoPilot对象放在哈希表中并使用xpath字符串作为哈希键...
正如您可能已经注意到的,vtd-xml的xpath评估发生在循环中,这与DOM非常不同。虽然这可能有点难以习惯......但它在实现卓越性能和低内存使用方面有很多优点/好处。
对于简单的xpath,例如那些涉及一个子标记查找的xpath,你可以放弃xpath,而是直接将你的应用程序逻辑基于光标...同样的规则适用:确保光标位置进入一块在离开该代码块时,app逻辑保持不变。
所以你有两个选择:最常见的是push pop()。但是对于简单的子查找,在调用toElement(FirstChild)之后,您只需调用toElement(Parent)返回起始位置。