Localizando o nó por espaços em branco contendo valor, utilizando XPath

votos
9

Preciso localizar o nó dentro de um arquivo xml por seu valor utilizando XPath. O problema araises quando o nó para encontrar contém valor com espaços em branco dentro. Fe:

<Root>
  <Child>value</Child>
  <Child>value with spaces</Child>
</Root>

Eu não posso construir o XPath para localizar o segundo nó filho.

Simples XPath / Root / criança funciona perfeitamente para as crianças, mas / Root [Criança = valor com espaços] retorna uma coleção vazia.

Eu já tentei mascarar espaços com % 20 , & # 20; , & Nbsp; e o uso de aspas e aspas duplas.

Ainda sem sorte.

Alguém tem uma idéia?

Publicado 26/12/2008 em 15:35
fonte usuário
Em outras línguas...                            


7 respostas

votos
0

você tentou # x20?

Respondeu 26/12/2008 em 16:10
fonte usuário

votos
10

Tente quer isto:

/Root/Child[normalize-space(text())=value without spaces]

ou

/Root/Child[contains(text(),value without spaces)]

ou (desde parece que o seu valor de teste pode ser o problema)

/Root/Child[normalize-space(text())=normalize-space(value with spaces)]

realmente não tenho executado qualquer um destes assim que a sintaxe pode ser instável.

Respondeu 26/12/2008 em 16:11
fonte usuário

votos
0

Eu pesquisei isso como no segundo link :

tente substituir o espaço usando " x0020 "

isso parece funcionar para o cara.

Respondeu 26/12/2008 em 17:14
fonte usuário

votos
18

Dependendo da sua situação exata, existem diferentes expressões XPath que irá selecionar o nó , cujo valor contém alguns espaços em branco.

Primeiro, lembremo-nos que qualquer um desses personagens é "espaço em branco":

    &#x09; - o Tab

    &#xA; -- nova linha

    &#xD; - retorno de carro

    ' 'ou &#x20; - o espaço

Se você sabe o valor exato do nó, dizem que é " Hello World" com um espaço, em seguida, uma expressão XPath mais direto:

     /top/aChild[. = 'Hello World']

irá selecionar este nó.

As dificuldades com a especificação de um valor que contenha espaços em branco, no entanto, vem do fato de que vemos todos os espaços em branco, assim como ... bem, espaços em branco e não sei se um é um grupo de espaços ou uma única guia.

Em XPath 2.0 pode-se usar expressões regulares e eles fornecem uma solução simples e conveniente . Assim, podemos usar uma expressão XPath 2,0 como a um abaixo:

    /*/aChild[matches(., "Hello\sWorld")]

para selecionar qualquer filho do nó de topo, cujo valor é a string "Olá" seguido por um espaço em branco seguido pelo string "World". Observe o uso da matches()função e do " \spadrão" que coincide com espaços em branco.

Em XPath 1.0 um teste conveniente se uma determinada string contém quaisquer caracteres em branco é:

not(string-length(.)= stringlength(translate(., ' &#9;&#xA;&#xD;','')))

Aqui usamos o translate()função de eliminar qualquer um dos quatro espaços em branco, e comparar o comprimento da cadeia resultante à do string original.

Assim, se em um editor de texto o valor de um nó é exibido como

"Olá Mundo",

podemos selecionar com segurança esse nó com a expressão XPath:

/*/aChild[translate(., ' &#9;&#xA;&#xD;','') = 'HelloWorld']

Em muitos casos, também pode usar a função XPath normalize-space(), que a partir de sua argumento de cadeia produz outra seqüência em que os grupos de esquerda e à direita espaço em branco é cortado, e cada espaço em branco dentro da cadeia é substituído por um único espaço.

No caso acima, vamos simplesmente usar a seguinte expressão XPath:

/*/aChild[normalize-space() = 'Hello World']

Respondeu 26/12/2008 em 18:33
fonte usuário

votos
1

Localizando o Atributo de valor contendo espaços em branco utilizando o XPath

I ter um tipo de elemento de entrada com o valor que contém o espaço em branco.

por exemplo:

<input type="button"  value="Import&nbsp;Selected&nbsp;File">

Eu resolvi isso usando esta expressão XPath.

//input[contains(@value,'Import') and contains(@value ,'Selected')and contains(@value ,'File')]

Espero que este irá ajudar vocês.

Respondeu 03/12/2014 em 07:43
fonte usuário

votos
0

" X0020 " trabalhou para mim em uma lebre com base CQ5 repositório / AEM em que os nomes de propriedade tinha espaços. Abaixo iria trabalhar para uma propriedade "Record ID" -

[(jcr:contains(jcr:content/@Record_x0020_ID, 'test'))]
Respondeu 05/02/2016 em 10:58
fonte usuário

votos
0

Todas as soluções acima realmente não funciona para mim. No entanto, há uma solução muito mais simples.