extracto de XQuery entre dos etiquetas
-
29-09-2019 - |
Pregunta
Actualmente estoy trabajando en la extracción de datos de HTML
. Me gustaría extraer el texto entre dos etiquetas <p class="xfHeading">
.
<p class="xfHeading"><b>XYZ:</b></p>
<p>asdfghjk</p>
<p>sdsdsd</p>
<p>asdvcvcfghjk</p>
<p class="xfHeading"><b>ABC:</b></p>
<P>fvgbhnjm</P>
<p class="xfHeading"><b>PQR:</b></p>
<ul>
</ul>
<p class="xfHeading"><b>MNO:</b></p>
<ul>
<li>jdjshdj</li>
</ul>
La salida debería ser:
asdfghjk
sdsdsd
asdvcvcfghjk
Una forma de hacer esto es:
/p[class="xfHeading"]/following-sibling::p[0]|/p[class="xfHeading"]/following-sibling::p[1]|/p[class="xfHeading"]/following-sibling::p[2]
o
/p[class="xfHeading"]/following-sibling::p[position()<4]
Sin embargo ya que el contenido entre sigue cambiando todo el tiempo que necesito una solución en la que el contenido entre el <p class="xfHeading">
dos etiquetas se extrae.
Solución
Uso
(//p[@class="xfHeading"])[1]
/following-sibling::p
[. << (//p[@class="xfHeading"])[2]]
/text()
Este medio de : Seleccionar los niños texto nodos de todos los elementos p
que está siguiendo a los hermanos del primer elemento p
en el documento con el atributo class
que tiene valor de xfHeading
, y que al mismo tiempo son anterior al segundo elemento p
en el documento con el atributo class
que tiene valor de xfHeading
.
Otros consejos
Editar : Después de su aclaración, mi sugerencia es utilizar un FLWOR expresión como la siguiente. Este busca una <p>
con el contenido de la etiqueta <b>
adecuadas en base a los contenidos exclusivos de esa etiqueta <b>
, y devuelve el texto de cada etiqueta <p>
que es un hermano de ella.
for $b in //p[class="xfHeading"]/b and $p in //p[class="xfHeading"]/p
where $b/text() = "XYZ:"
return p/text()
Tenga en cuenta que la //
es una construcción XPath, no un comentario
vieja respuesta ??strong>: Sin un ejemplo de lo que le gustaría a los datos resultantes se parecen, en respuesta a la pregunta es un poco difícil. Sin embargo, para seleccionar, por ejemplo, el texto dentro de una etiqueta <b>
, haría:
/p[class = "xfHeading"]/b/text()
En general, añadiendo text()
al final de una expresión devuelve el texto en el interior del nodo en cuestión.