1

我有一个如下所示的 XML。我想使用一个共享的 AutoPilot 遍历所有系列的兄​​弟姐妹。在 /a/b 上的 selectXPath 将我带到第一个 b 兄弟姐妹之后,我尝试使用相同的 AutoPilot 来 selectXPath 在 c 上,这将返回所有 c 兄弟姐妹。但是,在c遍历循环之后,我不知道如何带回b遍历循环的上下文。打算使用一个共享 AutoPilot 的目的是提高性能。有什么想法吗?

<a>
    <b>
        <c>c1</c>
        <d>d1.1</d>
        <d>d1.2</d>
        <d>d1.3</d>
        <d>d1.4</d>
        <d>d1.5</d>
        <d>d1.6</d>
        <e>e1</e>
    </b>
    <b>
        <c>c2</c>
        <d>d2.1</d>
        <d>d2.2</d>
        <d>d2.3</d>
        <e>e2</e>
    </b>
</a>

有了上面的 XML,我的动机是通过遍历 XML 的层次结构来获取值。实际上,要求是创建层次结构的 java 对象表示。为了实现这一点,我正在使用深度优先算法进行递归方法。下面只是为了展示我的意图,我只是为了循环。如前所述,在内部循环中,我被迫在循环内创建一个新的 AutoPilot 以维护遍历 /a/b 的另一个上下文。现在,我想知道如何才能拥有一台 AutoPilot。我试过他 vtd.push 和 vtd.pop。那没起效。

VTDGen vtdGen = new VTDGen();
vtdGen.setDoc(this.xml.getBytes());
vtdGen.parse(false);
VTDNav vtdNav = vtdGen.getNav();

AutoPilot autoPilot1 = new AutoPilot(vtdNav);
autoPilot1.selectXPath("/a/b");
while (autoPilot1.evalXPath() != -1)
{
    AutoPilot autoPilot2 = new AutoPilot(vtdNav);
    autoPilot2.selectXPath("c");
    System.out.println(autoPilot2.evalXPathToString());
    autoPilot2.selectXPath("d");
    while (autoPilot2.evalXPath() != -1)
    {
        System.out.println(vtdNav.toNormalizedXPathString(vtdNav.getCurrentIndex()));
    }
    autoPilot2.selectXPath("e");
    System.out.println(autoPilot2.evalXPathToString());
}

提前致谢。

4

1 回答 1

0

我修复了你的代码。如果有任何问题,请告诉我。请注意,AutoPilot 不会缓存 xpath 表达式。一个 xpath 对应一个 AutoPilot 对象。

VTDGen vtdGen = new VTDGen();
vtdGen.setDoc(this.xml.getBytes());
vtdGen.parse(false);
VTDNav vtdNav = vtdGen.getNav();
AutoPilot autoPilot2 = new AutoPilot(vtdNav);
autoPilot2.selectXPath("c");
AutoPilot autoPilot3 = new AutoPilot(vtdNav);
autoPilot3.selectXPath("e");
AutoPilot autoPilot4 = new AutoPilot(vtdNav);
autoPilot4.selectXPath("d");
System.out.println(autoPilot2.evalXPathToString());
autoPilot1.selectXPath("/a/b");
while (autoPilot1.evalXPath() != -1)
{

    System.out.println(autoPilot2.evalXPathToString());
    vtdNav.push();
    while (autoPilot2.evalXPath() != -1)
       {     System.out.println(vtdNav.toNormalizedXPathString(vtdNav.getCurrentIndex()));
    }
    vtdNav.pop();
   System.out.println(autoPilot3.evalXPathToString());
   System.out.println(autoPilot4.evalXPathToString());
}
于 2015-03-14T02:30:53.173 回答