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"]