¿Xpath puede devolver solo nodos que tengan un hijo de X?
Pregunta
¿Es posible utilizar XPath para seleccionar solo los nodos que tienen elementos secundarios en particular?Por ejemplo, de este XML solo quiero los elementos de mascotas que tengan un elemento secundario de "barra".Entonces el conjunto de datos resultante contendría el lizard
y pig
elementos de este ejemplo:
<pets>
<cat>
<foo>don't care about this</foo>
</cat>
<dog>
<foo>not this one either</foo>
</dog>
<lizard>
<bar>lizard should be returned, because it has a child of bar</bar>
</lizard>
<pig>
<bar>return pig, too</bar>
</pig>
</pets>
Este XPath me da todas las mascotas: "/pets/*"
, pero sólo quiero las mascotas que tienen un nodo hijo de nombre 'bar'
.
Solución
Aquí está, en todo su esplendor.
/pets/*[bar]
Inglés:Dame todos los hijos de pets
que tiene un hijo bar
Otros consejos
/pets/child::*[child::bar]
Perdón, no vi los comentarios de la respuesta anterior.
Pero en este caso prefiero usar el descendant::
eje, que incluye todos los elementos inferiores a los especificados:
/pets[descendant::bar]
En caso de que quieras ser más específico acerca de los niños, también puedes usar selectores en ellos.
Ejemplo:
<pets>
<cat>
<foo>don't care about this</foo>
</cat>
<dog>
<foo>not this one either</foo>
</dog>
<lizard>
<bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>
<pig>
<bar>don't return pig - it has no att=bar </bar>
</pig>
</pets>
Ahora solo te importa todo pets
tener cualquier hijo bar
que tiene un atributo att
con valor baz
.Puede utilizar la siguiente expresión xpath:
//pets/*[descendant::bar[@att='baz']]
Resultado
<lizard>
<bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>