在我的组织中,我们将xslt 1.0与xpath 1.0结合使用以进行大型xml转换。但是现在我们需要进行迁移。
我正在使用VTD-XML来解析和转换200MB的巨大xml,并且我有20多个xpath选择,因此我想为每个选择定义:
AutoPilot relationAutoPilot = new AutoPilot();
relationsautoPilot.selectXPath("object[@class='Example']");
AutoPilot first= new AutoPilot();
first.selectXPath("other");
....
public void methodCalulate(final VTDNav partAutoPilot, final AutoPilot partAutoPilot, final AutoPilot first, final AutoPilot second,final AutoPilot third,final AutoPilot fourth) {
navigator.push();
partAutoPilot.bind(navigator);
while ((i = partAutoPilot.evalXPath()) != -1) {
...
method3(navigator,first,second,third,fourth);
..
}
method3(final VTDNav navigator,final AutoPilot first, final AutoPilot second,final AutoPilot third,final AutoPilot fourth) {
navigator.push();
first.bind(navigator);
int i = -1;
while ((i = first.evalXPath()) != -1) {
//Do some buissiness logic
method2(navigator,second,third,fourth);
..
}
}
因此,我试图将它们放置在方法层次结构的顶部,而不是while,for-each等,以便能够花费更少的处理器速度和内存,但是存在问题。我想知道如何传递对象,因为:
简单的情况
public void methodCalculate(final VTDNav navigator, final AutoPilot partAutoPilot)
确定一个自动驾驶仪确定。
复杂案例
methodCalculate调用method3->调用method2->调用方法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);
}
....
并且每个方法都需要使用具有相对xpath的子选择,因此即使有新的转换规则,我也需要传递4个AutoPilot,其他method_0可能会出现,并且我需要添加其他AutoPilot。
所以我想知道在这种情况下如何进行?由于它们消耗大量内存并且计算成本很高,如何更有效地传递AutoObject?
我尝试什么?
我在调用methodCalulate的方法中从最顶层提取了AutoPilot,因此只能创建一次。并在methodCalulate中创建其他自动驾驶仪。它提高了速度,但是在接下来的创建AutoPilots的内联调用中创建了性能地狱。
编辑:
我可以添加带有AutoPilot的List,甚至是map和一个常量类作为键,以针对给定的选择搜索适当的AutoPilot。我不知道什么是最好的选择。
最佳答案
AutoPilot编译应在循环外进行...但是它不会消耗大量内存...您可能可以将所有autoPilot对象放入哈希表中,并使用xpath字符串作为哈希键...
您可能已经注意到,vtd-xml的xpath评估是在循环中进行的,这与DOM有很大不同。虽然这可能有点难以适应...但是在实现卓越性能和低内存使用方面有很多优点/好处。
同样对于简单的xpath(例如涉及一个子标记查找的xpath),您可以放弃xpath,而直接将应用程序逻辑基于游标...适用相同的规则:确保光标位置进入了应用程序逻辑的一部分离开该代码块后保持不变。
因此,您有两种选择:最常见的是push pop()。但是对于简单的子查找,在调用toElement(FirstChild)之后,您要做的就是调用toElement(Parent)返回到起始位置。