Como filtrar com XPath em todos os elementos sem um atributo específico
Pergunta
Meu XPath é um pouco enferrujado ... Vamos dizer que eu tenho esse arquivo XML simples:
<?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>
Gostaria de executar uma consulta XPath simples para analisar a todos os verdadeiros estados (por isso não puxar em estados onde o território = true). Tentei \ StateProvince [@territory! = 'True'], mas eu tenho zero. Outras variações parecem estar falhando. Isso parece que deve ser simples, mas não encontrar o que eu quero.
Qualquer ajuda apreciado.
Solução
Uma expressão XPath que seleciona os elementos queriam :
/*/States/StateProvince[not(@territory='true')]
Do nota ??strong> que deve-se evitar o //
abreviatura sempre que possível, uma vez que faz com que todo o documento (sub-árvore com raiz no nó de contexto) a ser digitalizado .
//
Só se a estrutura do documento XML é completamente desconhecido (e a expressão XPath se destina a ser usado accross muitos documentos XML com estrutura desconhecida) caso o uso do //
Seja abreviatura considerada .
Outras dicas
Você está muito perto:
//StateProvince[not(@territory) or @territory != 'true']
Caso você obtenha o resultado desejado.
Isso deve funcionar:
//StateProvince[not(@territory='true')]