2

I'm using VTD-XML to parse some XML files with Xpath expressions, now following showed up: I need to know the index of a node from the xml tree, after a bit of searching I found that a expression like this

count(//ds[name='cpu1']/preceding-sibling::*)+1

Provides me the needed index - my question is: As far I'm using VTD-XML (because its fast) is there a possibility to use this kind of expression within VTD-XML? Using the given expression causes just a XpathParseException.

My xml look like this:

<?xml version="1.0" encoding="UTF-8"?>
<rrd>
    <version>0003</version>
    <step>5</step>
    <lastupdate>1290585118</lastupdate>
    <ds>
        <name>cpu1</name>
        <type>DERIVE</type>
        <minimal_heartbeat>300.0000</minimal_heartbeat>
        <min>0.0</min>
        <max>1.0000</max>
        <last_ds>69375.6708</last_ds>
        <value>0.0001</value>
        <unknown_sec>0</unknown_sec>
    </ds>
    <ds>
        <name>cpu0</name>
        <type>DERIVE</type>
        <minimal_heartbeat>300.0000</minimal_heartbeat>
        <min>0.0</min>
        <max>1.0000</max>
        <last_ds>69375.6708</last_ds>
        <value>0.0001</value>
        <unknown_sec>0</unknown_sec>
    </ds>
...
onigunn
  • 4,730
  • 10
  • 58
  • 89
  • Can you show us the code? in which you tried to use the above XPath expression and it gave a parse error. – LarsH Nov 24 '10 at 12:16
  • Besides this is an XPath engine related questions, you wrote: *I need to know the index of a node*. But your XPath expression is an absolute expression, so it doesn't depend on context... –  Nov 24 '10 at 12:41

1 Answers1

2

According to the FAQ,

VTD-XML fully conforms with W3C XPath 1.0 recommendation. It supports all the built-in functions. It also supports many XPath 2.0 functions.

So if VTD-XML is rejecting a valid XPath 1.0 expression, there would seem to be a bug in VTD-XML. But the problem could be in the XPath expression, or in your code that uses VTD-XML.

The XPath expression you give appears to be valid. It's not very efficient though, so there may be a better way to do this in VTD-XML, without using XPath. E.g. going through the input records and counting till you get to the ds element whose name is cpu1.

LarsH
  • 27,481
  • 8
  • 94
  • 152