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

标签 java xml xpath vtd-xml

在我的组织中,我们使用 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/

    相关文章:

    jQuery 创建空的自闭标签

    java - 为 JSON 响应启用 @XMLAttribute

    java - 如何在 Java 中使用 XPATH 读取 xml

    html - 使用链接标签在 html 页面中链接的 XPath

    java - 为什么我会收到此错误?这是Java中kickstart 2020(分配)的第一个问题

    java - 一起旋转 ImageView 和 TextView

    java - java.Clock 中的混淆,systemDefaultZone() 返回 UTC 时间

    java - parser.setFeature 与 parser.setValidating

    php - XML 命名空间 - 如何获取它们?

    Java 8 问题尝试在使用继承和泛型时添加 Function FunctionalInterface 调用