Исключение дочерних элементов в выражении xpath

1

HI имеет следующий xml.

<filters>
    <filter>
        <field>
            <name>empId</name>
            <type>int</type>
        </field>
        <op>in</op>
        <value>eID</value>
        <valueType>PERI</valueType>
    </filter>
    <filter>
        <field>
            <name>desc</name>
            <type>string</type>
        </field>
        <op>in</op>
        <value>dbDesc</value>
        <valueType>PERI</valueType>
    </filter>
</filters>

Я хочу получить только элементы "name", "op" и "value". Iam, используя приведенное ниже выражение xpath. но не может исключить узлы "типа", которые находятся под элементом "field".

//filter//*[not(self::valueType)] and [not(following-sibling::type)]//text()

Мой вывод должен быть:

empId
in
eID
desc
in
dbDesc

Любая помощь?

Теги:
xpath

2 ответа

3
Лучший ответ

Следующее выражение XPath выберет текст из всех элементов name, op или value :

(//name|//op|//value)/text()

Обновление для запроса OP в комментариях:

Я хочу имя, op, значение только из элемента filters.

Отрегулируйте XPath аналогично тому, как вы упомянули в своем комментарии:

(//filters//name|//filters//op|//filters//value)/text()

Или, более эффективно (при условии, что его затягивание не теряет совпадений в вашем общем случае):

(/filters/filter/field/name|/filters/filter/op|/filters/filter/value)/text()
  • 0
    Это работает нормально, но проблема в том, что он возвращает другие элементы имени, которые находятся в верхней части xml. У меня есть большой XML-файл. Я разместил небольшую часть своего XML-файла в вопросе. Я хочу name, op, value только из элемента filters.
  • 0
    Я добавил // фильтры // имя вместо // имени. кажется работает.
Показать ещё 3 комментария
2

Это должно работать:

//filter//*[self::name or self::op or self::value]/text()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню