tutorial regulares online herramienta expresiones ejemplos ejemplo consultas xml xpath

regulares - xpath xml ejemplo



XPath: obtener el nodo primario del nodo secundario (5)

Necesito obtener el nodo principal para el nodo secundario "título 50"

Por el momento solo estoy usando

//*[title="50"]

¿Cómo podría obtener su padre? El resultado debe ser el nodo de la store .

<?xml version="1.0" encoding="utf-8"?> <d:data xmlns:d="defiant-namespace" d:mi="23"> <store d:mi="22"> <book price="12.99" d:price="Number" d:mi="4"> <title d:constr="String" d:mi="1">Sword of Honour</title> <category d:constr="String" d:mi="2">fiction</category> <author d:constr="String" d:mi="3">Evelyn Waugh</author> </book> <book price="8.99" d:price="Number" d:mi="9"> <title d:constr="String" d:mi="5">Moby Dick</title> <category d:constr="String" d:mi="6">fiction</category> <author d:constr="String" d:mi="7">Herman Melville</author> <isbn d:constr="String" d:mi="8">0-553-21311-3</isbn> </book> <book price="8.95" d:price="Number" d:mi="13"> <title d:constr="String" d:mi="10">50</title> <category d:constr="String" d:mi="11">reference</category> <author d:constr="String" d:mi="12">Nigel Rees</author> </book> <book price="22.99" d:price="Number" d:mi="18"> <title d:constr="String" d:mi="14">The Lord of the Rings</title> <category d:constr="String" d:mi="15">fiction</category> <author d:constr="String" d:mi="16">J. R. R. Tolkien</author> <isbn d:constr="String" d:mi="17">0-395-19395-8</isbn> </book> <bicycle price="19.95" d:price="Number" d:mi="21"> <brand d:constr="String" d:mi="19">Cannondale</brand> <color d:constr="String" d:mi="20">red</color> </bicycle> </store> </d:data>


Esto funciona en mi caso. Espero que puedas extraer significado de eso.

//div[text()=''building1'' and @class=''wrap'']/ancestor::tr/td/div/div[@class=''x-grid-row-checker'']


Solo como alternativa, puede usar ancestor .

//*[title="50"]/ancestor::store

Es más poderoso que el parent ya que puede llegar incluso al abuelo o al tatarabuelo


También puedes usar los dos puntos al final de la expresión. Ver este ejemplo:

//*[title="50"]/..


Utilice los ejes parent con el nombre del nodo primario.

//*[title="50"]/parent::store

Este XPath solo seleccionará el nodo principal si es una store .

Pero también puedes usar uno de estos

//*[title="50"]/parent::* //*[title="50"]/..

Estas xpaths seleccionarán cualquier nodo padre. Entonces, si el documento cambia, siempre seleccionará un nodo, incluso si no es el nodo que espera.

EDITAR

¿Qué sucede en el ejemplo dado donde el padre es una bicicleta pero el padre del padre es una tienda?

¿Asciende?

No, solo selecciona la tienda si es un padre del nodo que coincide con //*[title="50"] .

Si no, ¿hay un método para ascender en tales casos y devolver Ninguno si no existe tal padre?

Sí, puedes usar ejes ancestor

//*[title="50"]/ancestor::store

Esto seleccionará todos los antepasados ​​del nodo que coincidan con //*[title="50"] que son `tiendas. P.ej

<data xmlns:d="defiant-namespace" d:mi="23"> <store mi="1"> <store mi="22"> <book price="8.95" d:price="Number" d:mi="13"> <title d:constr="String" d:mi="10">50</title> <category d:constr="String" d:mi="11">reference</category> <author d:constr="String" d:mi="12">Nigel Rees</author> </book> </store> </store> </data>


Respuesta nueva y mejorada a una vieja pregunta frecuente ...

¿Cómo podría obtener su padre? El resultado debe ser el nodo de la store .

Utilice un predicado en lugar del eje parent:: o ancestor::

La mayoría de las respuestas aquí seleccionan el title y luego atraviesan el elemento de la store objetivo. Un enfoque más simple y directo es seleccionar el elemento de la store directamente en primer lugar, obviando la necesidad de atravesar a un parent:: o ancestor::

//div[text()=''building1'' and @class=''wrap'']/ancestor::tr/td/div/div[@class=''x-grid-row-checker'']

Si los elementos que intervienen varían en nombre:

//store[*/title = "50"]

O, en nombre y profundidad:

//store[.//title = "50"]