Précédent   Forum du club des développeurs et IT Pro > Autres langages > XML/XSL et SOAP > XQUERY/SGBD
XQUERY/SGBD Le langage XQUERY et tout ce qui a trait aux relations XML et bases de données : BDD XML native, intégration/extraction de XML, XML dans BDD relationnelle... Avant de poster -> FAQ XML, Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/02/2011, 18h20   #1
mimish
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 158
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 158
Points : 39
Points : 39
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 :
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 :
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
mimish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2011, 16h51   #2
Erwy
Rédacteur
 
Avatar de Erwy
 
Homme erwan
Développeur Web
Inscription : novembre 2003
Messages : 4 980
Détails du profil
Informations personnelles :
Nom : Homme erwan
Âge : 36
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : novembre 2003
Messages : 4 980
Points : 11 894
Points : 11 894
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 :
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
__________________
modérateur/rédacteur XML
Je ne reponds pas aux questions par MP

Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation
Erwy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 09h53   #3
mimish
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 158
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 158
Points : 39
Points : 39
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 :
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 :
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 :
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 ?
mimish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 11h44   #4
mimish
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 158
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 158
Points : 39
Points : 39
Bon j'ai pu amélioré un peu le programme , j'ai fait :

Code :
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 :
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
mimish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 14h14   #5
mimish
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 158
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 158
Points : 39
Points : 39
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 :
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 :
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 :
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 :
1
2
3
4
return

concat("   ",$result) <<<  au lieur de "   " je veux un saut de ligne.
Merci d'avance
mimish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 21h49   #6
Erwy
Rédacteur
 
Avatar de Erwy
 
Homme erwan
Développeur Web
Inscription : novembre 2003
Messages : 4 980
Détails du profil
Informations personnelles :
Nom : Homme erwan
Âge : 36
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : novembre 2003
Messages : 4 980
Points : 11 894
Points : 11 894
J'ai l'impression d'avoir le même résultat avec :
Code :
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
__________________
modérateur/rédacteur XML
Je ne reponds pas aux questions par MP

Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation
Erwy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h25.


 
 
 
 
Partenaires

Hébergement Web