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

XQUERY/SGBD XML Discussion :

requete et condition sous BaseX


Sujet :

XQUERY/SGBD XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut requete et condition sous BaseX
    Bonjour ,

    Je viens de commencé avec XQuery , je l'utilise sous BaseX.
    j'ai crée juste un fichier XML comme un exemple :

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <personnes>
       <etudiant classe="P2">
          <nom>CynO</nom>
          <prenoms>
             <prenom>Nicolas</prenom>
             <prenom>Laurent</prenom>
          </prenoms>
       </etudiant>
       <etudiant classe="P1">
          <nom>Superwoman</nom>
       </etudiant>
       <etudiant classe="P1">
          <nom>Don Corleone</nom>
       </etudiant>
    </personnes>
    et je veux extraire les prenom qui ont Cyn0 comme nom. quel est la requete que je dois utiliser ; si c'est en SQL sa sera du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select prenom from MaTable
    where nom='Cyn0'
    ET je veux savoir quel est la différence entre Exist et BaseX ?!

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Il y a différentes façon de faire ceci, certaine plu simple que ce que j'écris ici mais la requête "typique" Xquery ressemblera à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for $x in  doc("personne.xml")/personnes/etudiant
    where $x/nom='CynO'
    return $x/prenoms
    le système n'a rien à voir avec un select from where du sql , il est base de boucle imbriqué et d'appel de fonction.
    Néanmoins dans cette partie : le for sélectionne les éléments sur lesquels on va travailler.
    le where effectue les test
    le returne renvoie les valeurs finales

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    Merci pour votre réponse,
    Le problème que je rencontre maintenant c'est que je peux pas afficher les valeurs UNE par Une ... un exemple pour bien comprendre :

    j'ai le fichier XML suivant :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <Trace date="2011-02-14 09:33:21" name="Groupe 1">
     
         <Operation>
    		<Type>Del</Type>
    		<Position>11</Position>
    		<Offset>1</Offset>
    		<Timestamp>1297672512653</Timestamp>
    		<NumDocument>1</NumDocument>
    		<NumReplica>0</NumReplica>
    		<VectorClock>
    		<Entry>
    		<Replica>2</Replica>
    		<Clock>143</Clock>
    		</Entry>
    		<Entry>
    		<Replica>0</Replica>
    		<Clock>12</Clock>
    		</Entry>
    		<Entry>
    		<Replica>4</Replica>
    		<Clock>7</Clock>
    		</Entry>
    		</VectorClock>
    	</Operation>
     
           <Operation>
    		<Type>AUTRE</Type>
    		<Position>11</Position>
    		<Offset>1</Offset>
    		<Timestamp>1297672512653</Timestamp>
    		<NumDocument>1</NumDocument>
    		<NumReplica>0</NumReplica>
    		<VectorClock>
    		<Entry>
    		<Replica>2</Replica>
    		<Clock>143</Clock>
    		</Entry>
    		<Entry>
    		<Replica>0</Replica>
    		<Clock>12</Clock>
    		</Entry>
    		<Entry>
    		<Replica>4</Replica>
    		<Clock>7</Clock>
    		</Entry>
    		</VectorClock>
    	</Operation>
     
         <Operation>
    		<Type>Del</Type>
    		<Position>18</Position>
    		<Offset>1</Offset>
    		<Timestamp>1297672533513</Timestamp>
    		<NumDocument>2</NumDocument>
    		<NumReplica>0</NumReplica>
    		<VectorClock>
    		<Entry>
    		<Replica>2</Replica>
    		<Clock>165</Clock>
    		</Entry>
    		<Entry>
    		<Replica>0</Replica>
    		<Clock>13</Clock>
    		</Entry>
    		<Entry>
    		<Replica>4</Replica>
    		<Clock>22</Clock>
    		</Entry>
    		</VectorClock>
    	</Operation>
     
    	<Operation>
    		<Type>Del</Type>
    		<Position>17</Position>
    		<Offset>1</Offset>
    		<Timestamp>1297672533700</Timestamp>
    		<NumDocument>1</NumDocument>
    		<NumReplica>0</NumReplica>
    		<VectorClock>
    		<Entry>
    		<Replica>2</Replica>
    		<Clock>165</Clock>
    		</Entry>
    		</VectorClock>
    	</Operation>
    </Trace>
    pour la première balise <Operation> je veux afficher: Valeur_de_Replica"-"Valeur_de_Clock, dans notre exemple ça sera : [2-143 ,0-12,4-7] et je recommence la même pour la deuxiéme balise <Operation>...

    j'ai pu faire une requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    for $x in  /Trace/Operation
    let $r :=$x//Replica
    let $c :=$x//Clock
    where $x/Type = 'Del'
     
    return
    <result>
    {$r/text() ,"-", $c/text()}
    </result>
    mais il m'affiche touuuuuus les valeurs de Replica puis Touuuuuus les valeur de Clock dans l'exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <result>204-143127</result> <<< ici il m'affiche tous à la fois alors que je veux 2-143,0-12 et 4-7
    <result>204-1651322</result>
    <result>2-165</result>
    il m'affiche tout à la fois alors que je veux affiché une par une. qu'est ce que dois faire svp ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    Bon j'ai pu amélioré un peu le programme , j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for $x in  /Trace/Operation
     
      let $r :=$x//Replica
    	let $c :=$x//Clock
     
    for $i in $r,$j in $c
     
    where $x/Type='Del'
     
    return
     
    concat ("[",concat($i,"-",$j),"]")
    et j'ai un affichage comme un produit cartésien , c'est normal parceque j'ai deux boucle for imbriqué ... mais la question maintenant est comment faire deux boucle à la fois et qui ne seront pas imbriqué ?
    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for $i in ("A","B","C","D")
    for $j in ("1","2","3","4")
    return concat($i,$j)
    j'aurai comme résultat :
    A1 A2 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4 D1 D2 D3 D4


    comment faire pour avoir seulement:
    A1 B2 C3 et D4

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    Re salut,

    Bon je vois que j'ai posté plusieurs exemple et trop de blabla ... peut etre y aura des gens qui n'ont pas compris . alors je vais m'expliquer plus clairement.

    dans un exemple de XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <personnes>
    <etudiant>
        <nom>nom1</nom>
         <prenom>prenom1</prenom>
    </etudiant>
    <etudiant>
        <nom>nom2</nom>
         <prenom>prenom2</prenom>
    </etudiant>
    </personnes>
    je veux avoir comme résultat :
    [nom1,nom2]
    [prenom1,prenom2]


    au début j'ai fait une double boucle for , du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for $x in /personnes/etudiant
    
    let $r :=$x//nom
    let $c :=$x//prenom
    
    for $i in $r
    for $j in $c
    return
    concat($i,"   ",$j)
    j'avais comme résultat
    nom1 nom1 , nom1 prenom1 , nom2 nom1 et nom2 prenom2

    pour éviter ce problème j'ai ajouté un compteur .
    mon programme est devenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for $x in /personnes/etudiant
    
    let $r :=$x//nom
    let $c :=$x//prenom
    let $result := concat($i,"-",$j)
    for $i at $c1 in $r
    for $j at $c2 in $c
    return
    
    if($c1=$c2) then
    concat("   ",$result)
    voilà le problème est résolu pour l'effet de la boucle imbriqué ( s'il y aura des gens qui auront des problèmes de ce genre voila la solution )

    il me reste juste une seul question , comment faire un saut de ligne dans XQuery ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    return
    
    concat("   ",$result) <<<  au lieur de "   " je veux un saut de ligne.
    Merci d'avance

  6. #6
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    J'ai l'impression d'avoir le même résultat avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    xquery version "1.0";
    for $x in  doc("personne.xml")/personnes/etudiant
     
    return concat($x/prenom,' ',$x/nom,';')
    Pour le retour à la ligne il te faudra utiliser les caractères unicode

Discussions similaires

  1. Plantage requete SQL simple sous Delphi7/ADO avec Access
    Par tomy29 dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/08/2005, 11h09
  2. Réponses: 9
    Dernier message: 18/08/2005, 13h16
  3. Requete avec condition
    Par Tchinkatchuk dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/06/2005, 09h37
  4. Requete NOT IN sous MySQL 4.0
    Par lo72 dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/04/2004, 12h03
  5. Requete avec une sous-requete... Ne fonctionne qu'a moitie..
    Par mythtvtalk.com dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 18/08/2003, 09h54

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