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'.

¿Fue útil?

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top