首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在VTD中创建/传递许多AutoPilot对象实例?

如何在VTD中创建/传递许多AutoPilot对象实例?
EN

Stack Overflow用户
提问于 2016-08-22 08:09:46
回答 1查看 307关注 0票数 0

在我的组织中,我们使用XSLTXML1.0和XMLXPathXML1.0来进行大的转换。但现在我们需要移民。

我使用VTD-XML来解析和转换一个庞大的xml 200 am,我有20多个xpath选择,因此我想为每个xpath选择定义如下:

代码语言:javascript
复制
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);
    ..
    }
 }

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

  1. 简单案例 公共无效methodCalculate(最终VTDNav导航器,最终AutoPilot partAutoPilot)

好的,一AutoPilot,好的。

  1. MoreComplex大小写methodCalculate调用方法3->调用方法2->调用方法1 公共无效methodCalculate(最终导航,第三,第四){ VTDNav (导航,第一,第二,第三,第四);}公开无效method3(最终导航,最终第二,第三,最后第四){method2(导航,第二,第三,第四);}.

而且每个方法都需要带有相对xpath的子select,所以我需要传递4 AutoPilots,即使有新的转换规则,其他的method_也可以出现,我需要添加额外的AutoPilot。所以我想知道在这种情况下该如何进行?如何更有效地传递AutoObjects,因为它们消耗了大量的内存,而且计算非常昂贵。

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

编辑:我可以添加列表与AutoPilots,甚至映射和键的常量类,以搜索适当的AutoPilot为给定的选择。我不知道在这里什么是最好的选择。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-22 21:10:24

AutoPilot编译应该发生在循环之外..。但它不会消耗很多记忆..。您可能可以将所有autoPilot对象放到哈希表中,并使用xpath作为散列键.

正如您可能注意到的,vtd-xml的xpath计算是在一个循环中进行的,这与DOM非常不同。虽然这可能有点难以适应..。它在获得优异性能和低内存利用率方面有许多优点/优点。

此外,对于简单的xpath,例如涉及一个子标记查找的xpath,您可以放弃xpath,而直接将应用程序逻辑建立在游标上.同样的规则也适用:在离开代码块时,确保进入应用程序逻辑段的游标位置保持不变。

因此,您有几个选项:最常见的是push pop()。但是对于简单的子查找,在调用toElement(FirstChild)之后,只需调用toElement(父)返回起始位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39074287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档