views:

198

answers:

3

Hi I have a xml file for example like this

<root>
 <test>
  <bla>test1</bla>
 </test>
 <test>
  <bla>test2</bla>
 </test>
 <test>
 </test>
</root>

Now I want to parse it with the vtd-xml-parser by using XPath Expressions. First I search for the test tags by

VTDNav vn = vg.getNav(); AutoPilot ap = new AutoPilot(vn); ap.selectXPath("//test");

Now I want to search within this test tags for bla tags

int result = -1;
int count = 0;

while ((result = ap.evalXPath()) != -1) {
 // evaluate XPath Expressions within the test tags
}

Can someone tell me how to make this expressions? I don't want to search the entire document for bla tags as I want to be able to assign the bla tags to the test tags. I cannot do this if the bla tags are empty for example and I search the entire document for the bla tag.

+2  A: 

The initial paragraphs seem to indicate that you want this:

//test/bla

However, the ending paragraph seems to indicate that you want something different.

kdgregory
+2  A: 

You can declare another autopilot (shown below), although it is not always the simplest way

AutoPilot ap2 = new AutoPilot(); ap2.selectXPath("blah");

then nest that in the loop

while ((result = ap.evalXPath()) != -1) {
 // evaluate XPath Expressions within the test tags
  int i2=-1;
  while((i2=ap2.evalXPath())!=-1){
     // do more stuff here
  }
}

But the catch is that the second xpath needs to be relative xpath expression...

vtd-xml-author
A: 

Here is an alternative to using 2 xpaths. Use just one xpath to get the "test" tags, then use a loop to iterate over its children looking for "bla" tags.

VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("//test");

while (ap.evalXPath() != -1) {
    System.out.println("Inside Test tag");

    //now find the children called "bla"
    if(vn.toElement(VTDNav.FIRST_CHILD, "bla")){
    do{
        int val = vn.getText() ;
        if(val!=1){
        String value = vn.toNormalizedString(val);
        System.out.println("\tFound bla: " + value);
        }
    }
    while(vn.toElement(VTDNav.NEXT_SIBLING, "bla"));
    }
    //move back to parent
    vn.toElement(VTDNav.PARENT);
}
dogbane