Как фильтровать с XPath для всех элементов без определенного атрибута
Мой 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, чтобы разобрать все истинные состояния (так что не тяните в состояниях, где area = true). Я попробовал \StateProvince [@territory!= 'True'], но я получил нуль. Другие варианты, похоже, терпят неудачу. Кажется, это должно быть просто, но не найти то, что я хочу.
Любая помощь была оценена.
Ответы
Ответ 1
Одно выражение XPath, которое выбирает нужные элементы:
/*/States/StateProvince[not(@territory='true')]
Обратите внимание на, чтобы избежать аббревиатуры //
, когда это возможно, поскольку это приводит к сканированию всего документа (поддерева, корневого в контексте node).
Вышеупомянутое выражение XPath избегает использования сокращения //
, учитывая структуру первоначально предоставленного XML-документа,
Только если структура документа XML полностью неизвестна (и выражение XPath предназначено для использования во многих XML-документах с неизвестной структурой) следует использовать аббревиатуру //
.
Ответ 2
Вы очень близки:
//StateProvince[not(@territory) or @territory != 'true']
Должен получить нужный результат.
Ответ 3
Это должно работать:
//StateProvince[not(@territory='true')]