96 votes

Comment utiliser not contains() dans XPath ?

J'ai un fichier XML qui est structuré comme suit :

<whatson>
  <productions>    
    <production>
      <category>Film</category>
    </production>
    <production>
      <category>Business</category>
    </production>
    <production>
      <category>Business training</category>
    </production>
  </productions>
</whatson>

Et je dois sélectionner toutes les productions dont la catégorie ne contient pas "Business" (donc uniquement la première production dans cet exemple).

Est-ce possible avec XPath ? J'ai essayé de travailler dans ce sens, mais je n'ai rien trouvé :

//production[not(contains(category,'business'))]

173voto

Arran Points 11357

Les requêtes XPath sont sensibles à la casse. Après avoir regardé votre exemple (qui, soit dit en passant, est génial, plus personne ne semble fournir d'exemples !), je peux obtenir le résultat que vous souhaitez simplement en remplaçant "business" par "Business"

//production[not(contains(category,'Business'))]

J'ai testé cela en ouvrant le fichier XML dans Chrome, et en utilisant les outils Developer pour exécuter les requêtes XPath, et j'ai obtenu la catégorie Film.

28voto

LarsH Points 14726

Je dois sélectionner toutes les productions dont la catégorie ne contient pas "Business"

Bien que j'aie voté pour la réponse de @Arran comme étant correcte, je voudrais également ajouter ceci... Interprétée de manière stricte, la spécification de l'OP serait mise en œuvre sous la forme suivante

//production[category[not(contains(., 'Business'))]]

plutôt que

//production[not(contains(category, 'Business'))]

Ce dernier sélectionne toutes les productions dont les premier category enfant ne contient pas "Business". Les deux expressions XPath se comporteront différemment lorsqu'une expression production n'a pas category enfants, ou plus d'un.

Cela ne fait aucune différence dans la pratique tant que chaque <production> a exactement un <category> enfant, comme dans votre court exemple XML. Le fait que vous puissiez toujours compter sur le fait que cela soit vrai ou non dépend de divers facteurs, tels que l'existence d'un schéma qui applique cette contrainte. Personnellement, j'opterais pour l'option la plus robuste, car elle ne "coûte" pas grand-chose... en supposant que votre exigence, telle qu'elle est énoncée dans la question, soit réellement correcte (par opposition à, par exemple, "sélectionner chaque production qui n'a pas de catégorie contenant "Business"").

9voto

Shubham Jain Points 63

Vous pouvez utiliser not(expression) fonction.

not() est une fonction dans xpath (par opposition à un opérateur)

Exemple :

//a[not(contains(@id, 'xx'))]

OU

expression != true()

2voto

bace bogo Points 46

Il devrait s'agir de xpath avec la méthode not contains(), //production[not(contains(category,'business'))]

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