sacar - XPath contiene(texto(), ''alguna cadena'') no funciona cuando se usa con un nodo con más de un subnodo de texto
xpath list of elements (3)
Tengo un pequeño problema con Xpath contiene con dom4j ...
Digamos que mi XML es
<Home>
<Addr>
<Street>ABC</Street>
<Number>5</Number>
<Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
</Addr>
</Home>
Digamos que quiero encontrar todos los nodos que tienen ABC en el texto dado el elemento raíz ...
Así que la xpath que necesitaría escribir sería
//*[contains(text(),''ABC'')]
Sin embargo, esto no es lo que devuelve Dom4j ... es este un problema de dom4j o mi comprensión de cómo funciona xpath. ya que esa consulta devuelve solo el elemento de calle y no el elemento de comentario.
El DOM convierte el elemento Comentario en un elemento compuesto con cuatro etiquetas dos
[Text = ''XYZ''][BR][BR][Text = ''ABC'']
Supongo que la consulta debería seguir devolviendo el elemento, ya que debería encontrar el elemento y la ejecución contiene en él, pero no ... ...
la siguiente consulta devuelve el elemento pero devuelve mucho más que solo el elemento, también devuelve los elementos principales ... lo que no es deseable para el problema ...
//*[contains(text(),''ABC'')]
¿Alguien sabe la consulta xpath que devolvería solo los Elementos <Street/>
y <Comment/>
?
La etiqueta <Comment>
contiene dos nodos de texto y dos nodos <br>
como hijos.
Tu expresión xpath era
//*[contains(text(),''ABC'')]
Para romper esto,
-
*
es un selector que coincide con cualquier elemento (es decir, etiqueta) - devuelve un conjunto de nodos. - El
[]
es un condicional que opera en cada nodo individual en ese conjunto de nodos. Coincide si alguno de los nodos individuales en los que opera coincide con las condiciones dentro de los corchetes. -
text()
es un selector que coincide con todos los nodos de texto que son hijos del nodo de contexto; devuelve un conjunto de nodos. -
contains
es una función que opera en una cadena. Si se pasa un conjunto de nodos, el conjunto de nodos se convierte en una cadena devolviendo el valor de cadena del nodo en el conjunto de nodos que está primero en el orden del documento . Por lo tanto, solo puede coincidir con el primer nodo de texto en su elemento<Comment>
, es decir,BLAH BLAH BLAH
. Como eso no coincide, no obtienes un<Comment>
en tus resultados.
Necesitas cambiar esto a
//*[text()[contains(.,''ABC'')]]
-
*
es un selector que coincide con cualquier elemento (es decir, etiqueta) - devuelve un conjunto de nodos. - El
[]
externo es un condicional que opera en cada nodo individual en ese conjunto de nodos, aquí opera en cada elemento del documento. -
text()
es un selector que coincide con todos los nodos de texto que son hijos del nodo de contexto; devuelve un conjunto de nodos. - El
[]
interno es un condicional que opera en cada nodo en ese conjunto de nodos, aquí cada nodo de texto individual. Cada nodo de texto individual es el punto de inicio de cualquier ruta entre corchetes, y también puede referirse explícitamente a.
dentro de los paréntesis. Coincide si alguno de los nodos individuales en los que opera coincide con las condiciones dentro de los corchetes. -
contains
es una función que opera en una cadena. Aquí se pasa un nodo de texto individual (.
). Ya que se pasa el segundo nodo de texto en la etiqueta<Comment>
individualmente, verá la''ABC''
y podrá coincidir.
Me tomó un poco de tiempo pero finalmente me di cuenta. La xpath personalizada que contiene un texto a continuación funcionó perfectamente para mí.
//a[contains(text(),''JB-'')]
[contains(text(),'''')]
solo devuelve verdadero o falso. No devolverá ningún resultado del elemento.