2011-05-29 23 views
27

Estoy buscando la sintaxis xpath correcta para obtener un elemento primario específico de un elemento. Ejemplo:XML xpath, obtenga el elemento primario hasta un elemento específico

root 
    |- div 
    |  | 
    |  |----??? ---| 
    |  |   |-a [class=1] 
    |  |      |- text[ A TEXT I DON'T WANT] 
    |  | 
    |  | 
    |  | 
    |  |-text[THE TEXT] 
    | 
    |-div 
    | |-text[THE TEXT I DON'T WANT] 
    | 
    |-div 
    | |-text[THE TEXT I DON'T WANT] 

Quiero obtener el texto "el texto", pero la que contiene a [class=1] dentro de la misma div. Algo como esto:

//div//a[@class=1]/text[contains(.,'A TEXT')]/parent::*/parent::*.... <till div element> /text 
+0

Buena pregunta, +1. Vea mi respuesta para una expresión completa, exacta, corta y fácil de XPath de una sola línea que selecciona exactamente el nodo de texto deseado, sin usar ningún eje hacia atrás :) –

+1

Votación a favor para una pregunta clara y concisa. –

Respuesta

58

Dado el XML

 
<?xml version="1.0"?> 
<root> 
    <foo id="id1"> 
     <foo id="i2"> 
      <baz/> 
     </foo> 
    </foo> 
</root>

Usted puede encontrar el más cercano ancestro elemento foo de Baz utilizando la expresión XPath:

//baz/ancestor::foo[1]

que seleccionará el foo elemento nodo de id "i2".

Así que en su ejemplo (si entiendo bien) una vez que tiene el elemento "a" que desea, puede obtener una copia de seguridad del árbol al div antecesor más cercano agregando "/ ancestor :: div [1 ] "a tu expresión.

+0

Sí, tan simple es que :) ¡Gracias! –

+0

Tener todos mis votos por adelantado, para siempre. +1 –

9

Uso:

/root/div[.//a[@class='1']]/text() 

Esto selecciona cualquier nodo de texto que es un niño de cualquier elemento a que tiene un atributo de class con valor '1' y que (el elemento a) es un descendiente de cualquier elemento div es un elemento secundario del elemento superior denominado root.

+0

OP necesita 'EL TEXTO', su expresión recuperará 'A TEXT' –

+0

Buena observación - Creo que no entendí la pregunta cuando la contesté hace un año - corregida ahora. Por favor, eche un vistazo y anule su voto negativo. –

Cuestiones relacionadas