45 votes

Expression Xpath avec plusieurs prédicats

Je suis en train de construire un complexe de l'expression xpath qui vous permettront de répondre à la condition suivante.

À partir de données XML ci-dessous, les retours de l' Utilisateur de l'entité qui:

  1. Son identifiant de connexion est "user1"
  2. Son nom est "Utilisateur 1"
  3. Il dispose de 2 profils différents des valeurs qui sont "opérateur" et "admin" (je ne sais pas exactement les commander à l'avance)

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

Quelqu'un peut-veuillez fournir un exemple d'un tel cas?

EDIT: Ajout d'un profil complexe de l'entité

71voto

Greg Beech Points 55270

Les éléments suivants doivent faire ce que vous êtes après:

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

Avoir deux tests pour l' profile de la valeur peut sembler étrange, mais comme il y a plusieurs profile des nœuds puis la condition est satisfaite, à condition qu'au moins un nœud correspond à l'essai.

La raison pour laquelle vous pouvez comparer profile directement à un string, même si c'est en réalité un node , c'est que l' string-value d'un nœud d'élément est l' string-value de l'ensemble de ses descendants concaténées, qui dans ce cas est le contenu de value.

Si profile contient plus d'éléments que value que vous auriez à utiliser un peu plus complexe prédicat de test pour déterminer l'existence d'une correspondance profile nœud basé uniquement sur le value (cela devrait fonctionner avec la mise à jour de votre question):

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

6voto

Dimitre Novatchev Points 147842

Ici, c'est un plus de réponse exacte (à l'heure actuelle Greg Hêtre réponse ne vérifie pas la condition 3. dans le problème: l' user élément doit avoir exactement 2 profile des enfants):

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

1voto

dirkgently Points 56879

En supposant users est la racine:

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

0voto

Ankush Jetly Points 11

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X