xmlpath XPath: Como selecionar elementos com base em seu valor?




xpath training (2)

//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]

A razão pela qual eu adiciono essa resposta é que eu quero explicar o relacionamento de . e text() .

A primeira coisa é quando se usa [] , existem apenas dois tipos de dados:

  1. *[number] para selecionar um nó do conjunto de nós
  2. *[bool] para filtrar um conjunto de nós do conjunto de nós

Neste caso, o valor é avaliado como booleano pela função boolean() e existe uma regra:

Os filtros são sempre avaliados em relação a um contexto.

Quando você precisa comparar text() ou . com uma string "Data" , ele primeiro usa a função string() para transformá-los em string, depois obtém um resultado booleano.

Existem duas regras importantes sobre string() :

  1. A função string() converte um conjunto de nós em uma string retornando o valor da string do primeiro nó no conjunto de nós, o que, em alguns casos, pode gerar resultados inesperados.

    text() é o caminho relativo que retorna um conjunto de nós que contém todo o nó de texto do nó atual (nó de contexto), como ["Data"] . Quando ele é avaliado por string(["Data"]) , ele retornará o primeiro nó do conjunto de nós, de modo que você obterá "Data" somente quando houver apenas um nó de texto no conjunto de nós.

  2. Se você quiser que a função string() concatene todo o texto filho, deverá passar um único nó em vez de um conjunto de nós.

    Por exemplo, obtemos um node-set ['a', 'b'] , você pode passar o nó pai para string(parent) , isso retornará 'ab' e da causa string(.) No seu caso retornará uma string concatenada "Data" .

Ambas as formas terão o mesmo resultado apenas quando houver um nó de texto.

Eu sou novo em usar XPath e isso pode ser uma questão básica. Por favor, tenha paciência comigo e me ajude a resolver o problema. Eu tenho um arquivo XML como este:

<RootNode>
  <FirstChild>
    <Element attribute1="abc" attribute2="xyz">Data</Element>
  <FirstChild>
</RootNode>

Eu posso validar a presença de uma tag <Element> com:

//Element[@attribute1="abc" and @attribute2="xyz"]

Agora eu também quero verificar o valor da tag para a string "Data" . Para conseguir isso, me disseram para usar:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

Quando uso a expressão posterior, recebo o seguinte erro:

Mensagem de falha de declaração: Nenhum //Element[@attribute1="abc" and @attribute2="xyz" and Data] selecionado por nós //Element[@attribute1="abc" and @attribute2="xyz" and Data]

Por favor, forneça-me seu conselho se a expressão XPath que eu usei é válida. Se não, qual será a expressão XPath válida?


A condição abaixo:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

verifica a existência do elemento Dados dentro de Elemento e não para Dados de valor do elemento.

Em vez disso você pode usar

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]