gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:34:57 26 4
gpt4 key购买 nike

在我的组织中,我们使用 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 等中,以便能够花费更少的处理器速度和内存,但有一个问题。我想知道如何传递对象,因为:

  1. 简单案例

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

好的,一个 AutoPilot 就可以了。

  • 更复杂的情况 methodCalculate 调用方法3->调用方法2->调用方法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。所以我想知道在这种情况下该如何进行?如何更有效地传递AutoObjects,因为它们消耗大量内存并且计算成本非常昂贵?

    我尝试什么?我将 AutoPilot 从最顶层提取到调用 methodCalulate 的方法中,以便它们创建一次。并在 methodCalulate 中创建其他 AutoPilot。它提高了速度,但在下一个内联调用中创建 AutoPilots 会造成性能 hell 。

    编辑:我可以添加带有 AutoPilots 的列表,甚至可以添加 map 和常量类作为键来搜索给定选择的正确 AutoPilot。我不知道这里最好的选择是什么。

    最佳答案

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

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

    对于简单的 xpath,例如涉及一个子标签查找的 xpath,您可以放弃 xpath,而直接将您的应用程序逻辑基于光标...适用相同的规则:确保光标位置进入一个片段离开该代码块后,应用程序逻辑保持不变。

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

    关于java - 如何在 VTD-XML 中创建/传递大量 AutoPilot 对象实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39074287/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com