Xpath и VTD-XML, получение индекса узла - PullRequest
2 голосов
/ 24 ноября 2010

Я использую VTD-XML для синтаксического анализа некоторых файлов XML с выражениями Xpath, теперь показывается следующее: мне нужно знать индекс узла из дерева 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>
...

1 Ответ

2 голосов
/ 24 ноября 2010

Согласно FAQ ,

VTD-XML полностью соответствует рекомендации W3C XPath 1.0.Поддерживаются все встроенные функции.Он также поддерживает множество функций XPath 2.0.

Так что, если VTD-XML отклоняет допустимое выражение XPath 1.0, в VTD-XML может возникнуть ошибка.Но проблема может заключаться в выражении XPath или в вашем коде, который использует VTD-XML.

Представленное вами выражение XPath представляется действительным.Это не очень эффективно, поэтому может быть лучший способ сделать это в VTD-XML, без использования XPath.Например, просматривая входные записи и считая, пока не дойдете до элемента ds, имя которого cpu1.

...