IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XML/XSL et SOAP Discussion :

XML Xpath recherche avec plusieurs critères


Sujet :

XML/XSL et SOAP

  1. #1
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut XML Xpath recherche avec plusieurs critères
    Bonjour,

    J'ai beau faire pas mal de recherche sur le net mais je ne trouve pas bonheur

    Voici mon XML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <Objects>
    <Object>
    <Property Name="CLIENT">123456789</Property>
    <Property Name="REF">123456789</Property>
    <Property Name="NB">77</Property>
    <Property Name="VAL"/>
    </Object>
    <Object>
    <Property Name="CLIENT">123456789</Property>
    <Property Name="REF">987654111 </Property>
    <Property Name="NB">88</Property>
    <Property Name="VAL"/>
    </Object>
    <Object>
    <Property Name="CLIENT">123000000</Property>
    <Property Name="REF">987654111 </Property>
    <Property Name="NB">99</Property>
    <Property Name="VAL"/>
    </Object>
    <Object>
    J'aimerais faire une selection d'une partie pour pourvoir mettre VAL a jour (avec InnerText)
    J'ai pensé a faire un truc comme ça mais ça ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "//*[@Name='CLIENT' and  text()=123456789][@Name='REF' and  text()=987654111]"
    J'ai fait plusieurs variant mais rien a faire, ça ne fonctionne pas


    Attention dans le XML il y a des "CLIENT" avec un numéro identique et des "REF" identique donc pas possible de faire une recherche que par REF ou que par CLIENT

    Merci d'avance pour votre aide

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    [1]
    "//*[@Name='CLIENT' and text()=123456789][@Name='REF' and text()=987654111]"
    Par là, vous entendiez, peut-être, ça pour être correct.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "//*[(@Name='CLIENT' and text()=123456789) or (@Name='REF' and text()=987654111)]"
    Mais comme on ne suppose plus que souvent que le document xml ne soit pas validaté préalablement, ou en tout cas, on sens plus sécure d'écrire comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "//*[(@Name='CLIENT' and  text()='123456789') or (@Name='REF' and text()='987654111')]"
    En puis, en cas de text(), c'est souvent souhaîtable d'écrire comme ça pour éliminer le caprice d'espace vide artificiel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "//*[(@Name='CLIENT' and normalize-space()='123456789') or (@Name='REF' and normalize-space()='987654111')]"
    [2] Maintenant, le xpath précédant souffre un défaut souvent grave, viz, il résulte un mélange de Object et de Property résultant une confusion de noeud en contexte et qu'on attend incorrectement certain ordre pour travailler avec.

    Il vaut beaucoup mieux de ce faire correctement. On commence par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "//*[(@Name='CLIENT' and  normalize-space()='123456789') and following-sibling::*[@Name='REF' and normalize-space()='987654111']]"
    Quand il trouve un liste de noeuds, on applique un xpath supplimentaire avec chaque noeud dedans en contexte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "./following-sibling::*[@Name='REF' and normalize-space()='987654111']"
    pour correctement trouver le(s) noeud(s) Property attendu.

    Voilà !

  3. #3
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut
    Merci tsuji pour votre aide

    Effectivement j'ai copié la mauvaise ligne (il manque bien le OR qui fonctionnait mais il me donnait 2 résultats)

    1) Avec le XPATH suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "//*[(@Name='CLIENT' and  text()='123456789') or (@Name='REF' and text()='987654111')]"
    Les deux résultats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Name   #text    
    ----   -----    
    CLIENT 123456789
    CLIENT 123456789
    La ligne 1 correspond à la ligne au client : "123456789" avec la REF : "123456789" et la ligne 2 correspond à la ligne au client : "123456789" avec la REF : "987654111"

    Avec le XPATH suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "//*[(@Name='CLIENT' and normalize-space()='123456789') or (@Name='REF' and normalize-space()='987654111')]"
    2) j'ai le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Name   #text     
    ----   -----     
    CLIENT 123456789 
    CLIENT 123456789
    REF    987654111
    REF    987654111
    3) Avec le XPATH suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "//*[(@Name='CLIENT' and  normalize-space()='123456789') and following-sibling::*[@Name='REF' and normalize-space()='987654111']]"
    j'ai le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Name   #text    
    ----   -----
    CLIENT 123456789
    4) Avec le XPATH suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "./following-sibling::*[@Name='REF' and normalize-space()='987654111']"
    Il retourne rien

    L'avant dernier (N° 3) est le résultat attendu (c'est top merci)

    Auriez-vous des liens avec des exemples en général sur XPATH ?

    Merci beaucoup

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Pour 1), vous pouvez vous remarquer que vous écirviez aver un espace vide dans le texte "987654111& # x 2 0 ;" (j'ai mis un espace entre les symbols pour qu'ils rendrent) à la fin pour tous les balises Property avec @Name='REF' !

    Utilisez les versions avec normalize-space(), c'est là pour une raison.

  5. #5
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut
    Il a du avoir une erreur lorsque j'ai fait la discussion, il n'y a pas d'espace. toutes mes excuses.

    Merci pour tout
    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche avec plusieurs critères
    Par Eco dans le forum Excel
    Réponses: 12
    Dernier message: 20/07/2016, 18h07
  2. Recherche avec plusieurs critères et mise à jour automatique
    Par emowpya dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/02/2013, 17h36
  3. [MySQL] recherche avec plusieurs critéres
    Par hous04 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 01/02/2012, 14h50
  4. Réponses: 1
    Dernier message: 18/09/2010, 02h40
  5. VBA-E Comment réaliser une recherche avec plusieurs critères ?
    Par Larsen21 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 14/12/2006, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo