tutorial regulares online herramienta expresión expresiones ejemplo consultas xml xpath predicate

xml - regulares - Expresión de Xpath con múltiples predicados



xml find by xpath (4)

Estoy intentando construir una expresión compleja de xpath que responderá a la siguiente condición.

A partir de los datos XML a continuación, devuelve la entidad Usuario que:

  1. Su nombre de usuario es " usuario1 "
  2. Su nombre es " Usuario 1 "
  3. Él tiene 2 valores de perfiles diferentes que son " operador " y " administrador " (no sé el orden exacto por delante)

    <user> <login>user1</login> <name>User 1</name> <profile> <value>admin</value> <id>2</id> <description>admin users</description> </profile> <profile> <value>operator</value> <id>1</id> <description>Operator</description> </profile> </user> <user> <login>user2</login> <name>User 2</name> <profile> <value>admin</value> <id>4</id> <description>admins users</description> </profile> <profile> <value>poweruser</value> <id>5</id> <description>power users</description> </profile> </user> </root>

¿Puede alguien proporcionar un ejemplo para un caso así?

EDITAR: se agregó una entidad de perfil complejo


Asumiendo users es la raíz:

/users/user[login=''user1'' and name=''User 1'' and (profile=''admin'' and profile=''operator'')]


Lo siguiente debe hacer lo que busca:

/root/user[login=''user1'' and name=''User 1'' and profile=''admin'' and profile=''operator'']

Tener dos pruebas para el valor del profile puede parecer extraño, pero como hay múltiples nodos de profile , la condición se cumplirá siempre que al menos un nodo coincida con la prueba.

La razón por la que puede comparar un profile directamente a una string , aunque en realidad sea un node es que el string-value de string-value de un nodo de elemento es el string-value de string-value de todos sus descendientes concatenadas, que en este caso son solo los contenidos de value .

Si el profile contiene más elementos que value , debe usar una prueba de predicado un poco más compleja para determinar la existencia de un nodo de profile coincidente basado solo en el value (esto debería funcionar con su pregunta actualizada):

/root/user[login=''user1'' and name=''User 1'' and profile[value=''admin''] and profile[value=''operator'']]


Aquí hay una respuesta más exacta (en este momento, la respuesta de Greg Beech no verifica la condición 3. en el problema: el elemento user debe tener exactamente 2 hijos de profile ):

/*/user [login=''user1'' and name=''User 1'' and not(profile[3]) and profile/value=''admin'' and profile/value=''operator'' ]


/root/user[login=''user1'' and name=''User 1'' and profile/value=''admin'' and profile/value=''operator''