使用1个AutoPilot在一系列兄弟姐妹中遍历一系列兄弟姐妹?

时间:2015-03-12 03:27:02

标签: vtd-xml

我有一个如下所示的XML。我想使用一个共享的AutoPilot遍历所有兄弟系列。在/ a / b上的selectXPath之后,我带来了第一个b兄弟,我试图使用相同的AutoPilot来选择c上的X路径,它将返回所有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());
}

提前致谢。

1 个答案:

答案 0 :(得分: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());
}