Xpath和VTD-XML,获取节点索引

发布于 2024-10-04 16:16:58 字数 1305 浏览 6 评论 0原文

我正在使用VTD-XML用Xpath表达式解析一些XML文件,现在出现以下内容:我需要知道xml树中节点的索引,经过一番搜索后我发现像这样的表达式

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

为我提供了所需的索引 - 我的问题是:到目前为止我正在使用 VTD-XML(因为它很快)是否有可能在 VTD-XML 中使用这种表达式?使用给定的表达式只会导致 XpathParseException。

我的 xml 看起来像这样:

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧街凉风 2024-10-11 16:16:58

根据常见问题解答

VTD-XML完全符合W3C XPath
1.0推荐。它支持所有内置功能。它还
支持许多XPath 2.0功能。

因此,如果 VTD-XML 拒绝有效的 XPath 1.0 表达式,则 VTD-XML 中似乎存在错误。但问题可能出在 XPath 表达式中,或者出在使用 VTD-XML 的代码中。

您给出的 XPath 表达式似乎是有效的。但它的效率不是很高,因此可能有更好的方法在 VTD-XML 中执行此操作,而无需使用 XPath。例如,遍历输入记录并计数,直到找到名称为 cpu1ds 元素。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文