English 中文(简体)
VTD XML inner XPath Expressions
原标题:

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.

最佳回答

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...

问题回答

The initial paragraphs seem to indicate that you want this:

//test/bla

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

For people who is learning VTD-XML there is a excellent how to programming article here http://www.codeproject.com/Articles/28237/Programming-XPath-with-VTD-XML wrote by the VTD developers itself.

Didn t find this one there homepage, but it help a lot to start up.

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("	Found bla: " + value);
        }
    }
    while(vn.toElement(VTDNav.NEXT_SIBLING, "bla"));
    }
    //move back to parent
    vn.toElement(VTDNav.PARENT);
}




相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签