Как фильтровать с помощью XPath все элементы без определенного атрибута - PullRequest
18 голосов
/ 01 мая 2009

Мой XPath немного ржавый ... Допустим, у меня есть этот простой XML-файл:

<?xml version="1.0" encoding="utf-8" ?>
<States xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<States>
<StateProvince name="ALABAMA" abbrev="AL" />
....
<StateProvince name="AMERICAN SAMOA" abbrev="AS" territory="true"  />
</States>
</States>

Я бы хотел выполнить простой запрос XPath для анализа всех истинных состояний (поэтому не тяните в состояниях, где территория = истина). Я пытался \ StateProvince [@territory! = 'True'], но получил ноль. Другие варианты, кажется, терпят неудачу. Кажется, это должно быть просто, но я не могу найти то, что хочу.

Любая помощь приветствуется.

Ответы [ 3 ]

31 голосов
/ 01 мая 2009

Одно выражение XPath, которое выбирает нужные элементы :

/*/States/StateProvince[not(@territory='true')]

Обратите внимание , что следует по возможности избегать аббревиатуры //, так как это приводит к сканированию всего документа (поддерева с корневым узлом в контексте) .

Вышеупомянутое выражение XPath позволяет избежать использования // аббревиатуры с учетом структуры первоначально предоставленного XML-документа.

Только если структура документа XML полностью неизвестна (и выражение XPath предназначено для использования во многих документах XML с неизвестной структурой), следует использовать сокращение // считаться .

6 голосов
/ 01 мая 2009

Вы очень близки:

//StateProvince[not(@territory) or @territory != 'true']

Должен получить желаемый результат.

3 голосов
/ 01 мая 2009

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

//StateProvince[not(@territory='true')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...