在我的组织中,我们使用XSLTXML1.0和XMLXPathXML1.0来进行大的转换。但现在我们需要移民。
我使用VTD-XML来解析和转换一个庞大的xml 200 am,我有20多个xpath选择,因此我想为每个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);
..
}
}所以我试着把它们放在方法层次结构的顶端,而不是在时间,为-每个等等,以便能够花费较少的处理器速度和内存,但有一个问题。我想知道如何传递对象,因为:
好的,一AutoPilot,好的。
而且每个方法都需要带有相对xpath的子select,所以我需要传递4 AutoPilots,即使有新的转换规则,其他的method_也可以出现,我需要添加额外的AutoPilot。所以我想知道在这种情况下该如何进行?如何更有效地传递AutoObjects,因为它们消耗了大量的内存,而且计算非常昂贵。
我试了什么?我将AutoPilot从调用methodCalulate的方法的最顶层中提取出来,以便只创建一次。在methodCalulate中创建其他AutoPilots。它提高了速度,但是在下一个内联调用中,创建AutoPilots创建了性能地狱。
编辑:我可以添加列表与AutoPilots,甚至映射和键的常量类,以搜索适当的AutoPilot为给定的选择。我不知道在这里什么是最好的选择。
发布于 2016-08-22 21:10:24
AutoPilot编译应该发生在循环之外..。但它不会消耗很多记忆..。您可能可以将所有autoPilot对象放到哈希表中,并使用xpath作为散列键.
正如您可能注意到的,vtd-xml的xpath计算是在一个循环中进行的,这与DOM非常不同。虽然这可能有点难以适应..。它在获得优异性能和低内存利用率方面有许多优点/优点。
此外,对于简单的xpath,例如涉及一个子标记查找的xpath,您可以放弃xpath,而直接将应用程序逻辑建立在游标上.同样的规则也适用:在离开代码块时,确保进入应用程序逻辑段的游标位置保持不变。
因此,您有几个选项:最常见的是push pop()。但是对于简单的子查找,在调用toElement(FirstChild)之后,只需调用toElement(父)返回起始位置。
https://stackoverflow.com/questions/39074287
复制相似问题