regulares online expresiones examples attribute xpath

online - XPath: ¿Cómo seleccionar elementos en función de su valor?



xpath selenium (2)

La condición a continuación:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

comprueba la existencia de los datos del elemento dentro del elemento y no los datos del valor del elemento.

En su lugar puedes usar

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]

Soy nuevo en el uso de XPath y esta puede ser una pregunta básica. Por favor ten paciencia conmigo y ayúdame a resolver el problema. Tengo un archivo XML como este:

<RootNode> <FirstChild> <Element attribute1="abc" attribute2="xyz">Data</Element> <FirstChild> </RootNode>

Puedo validar la presencia de una etiqueta <Element> con:

//Element[@attribute1="abc" and @attribute2="xyz"]

Ahora también quiero verificar el valor de la etiqueta para la cadena "Data" . Para lograr esto me dijeron que usara:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

Cuando uso la expresión posterior, aparece el siguiente error:

Mensaje de error de aserción: No hay nodos coincidentes //Element[@attribute1="abc" and @attribute2="xyz" and Data]

Por favor, dame tu consejo si la expresión XPath que he usado es válida. Si no, ¿cuál será la expresión válida de XPath?


//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]

La razón por la que agrego esta respuesta es que quiero explicar la relación de . y el text() .

Lo primero es que cuando se usa [] , solo hay dos tipos de datos:

  1. *[number] para seleccionar un nodo del conjunto de nodos
  2. *[bool] para filtrar un conjunto de nodos de un conjunto de nodos

En este caso, el valor se evalúa como booleano mediante la función boolean() , y hay una regla:

Los filtros siempre se evalúan con respecto a un contexto.

Cuando necesites comparar text() o . con una cadena "Data" , primero utiliza la función string() para transformarlas a tipo de cadena, y luego obtiene un resultado booleano.

Hay dos reglas importantes sobre la string() :

  1. La función string() convierte un conjunto de nodos en una cadena devolviendo el valor de cadena del primer nodo en el conjunto de nodos, que en algunos casos puede producir resultados inesperados.

    text() es la ruta relativa que devuelve un conjunto de nodos que contiene todo el nodo de texto del nodo actual (nodo de contexto), como ["Data"] . Cuando se evalúa por string(["Data"]) , devolverá el primer nodo del conjunto de nodos, por lo que obtendrá "Datos" solo cuando hay un solo nodo de texto en el conjunto de nodos.

  2. Si desea que la función string() concatene todo el texto secundario, debe pasar un solo nodo en lugar de un conjunto de nodos.

    Por ejemplo, obtenemos un conjunto de nodos [''a'', ''b''] , puede pasar allí el nodo padre a string(parent) , esto devolverá ''ab'' , y de la string(.) de causa string(.) En su caso, se devolverá una cadena concatenada "Data" .

Ambas formas obtendrán el mismo resultado solo cuando haya un nodo de texto.