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 13/07/2011, 17h09   #1
tigunn
Membre chevronné
 
Avatar de tigunn
 
Homme
Développeur de bug
Inscription : janvier 2003
Messages : 565
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Développeur de bug

Informations forums :
Inscription : janvier 2003
Messages : 565
Points : 607
Points : 607
Par défaut Comment récupérer un element / n en fonction d'un de ses attribut

Bonjour,

Tout d'abord, je débute vraiment sous XQuery.
Mais il se trouve que j'en aurais besoin.

Je voudrais donc récupérer dans un fichier xml d'une base existDB toutes les balises item dont l'attribut = "fragment".
le xml:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
	....</teiHeader>
	<text xml:id="T2377" type="scenarique" subtype="PP">
		<body>
			<pb xml:id="g226_3_f_015__r____" type="recto" n="1"/>
			<list type="gloss">
				<head>
					<term dbp:hand="GF-encre" rend="underline">
						<choice>
							<abbr>gds</abbr>
							<expan>g<ex>ran</ex>ds</expan>
						</choice>
						<choice>
							<abbr>Hom</abbr>
							<expan>Hom<ex>mes</ex></expan>
						</choice>
					</term>
				</head>
				<label>
					<term dbp:hand="GF-encre">Luther</term>
				</label>
				<item type="fragment" n="1">
					<cit dbp:hand="GF-encre">
						<quote>donna à la cupidité des princes <choice>...
mais je n'arrive au mieux qu'a récupérer tout le fichier
la requete:
Code :
1
2
3
declare namespace dbp="http://dossiers-flaubert.ish-lyon.cnrs.fr/ns/1.0";
let $doc := doc("/db/flaubert/g226_3_f_015__r____-ver3.xml")
return $doc//item[@type="fragment"]
celle-ci ne fonctionne pas; et si je return $doc seul j'obtiens tout le document
__________________
"le rhume distillation - L’estomac est la cucurbite, le cerveau le chapiteau, & le nez le réfrigérant par lequel s’écoule goutte à goutte le produit de la distillation."
de Avicenne

Le monde se divise en deux: ceux qui utilisent le tag et les autres.

Un problème? venez en découdre!
tigunn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 18h30   #2
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 078
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 078
Points : 10 300
Points : 10 300
Envoyer un message via Skype™ à thelvin
Je connais pas grand-chose aux BDD XML, mais je jette une idée comme ça :
Avec le XPath

$doc//item[@type="fragment"]

tu impliques que l'élément <item> n'est dans aucun namespace.
C'est voulu ? C'est sûr ? Il n'y a pas de xmlns="machin" nulle part dans ton XML ? Je trouve inhabituel qu'il y ait du dbp:hand par-ci par-là dans les attributs, mais que les éléments principaux n'aient pas de namespace.

Si par le plus grand des hasards il y avait bel et bien, à la racine, un namespace genre

xmlns="http://machin.com/truc"

Il te faudrait quelque chose comme ça :

Code :
1
2
3
declare namespace truc="http://machin.com/truc";
 
return $doc//truc:item[@type="fragment"]
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 11h16   #3
tigunn
Membre chevronné
 
Avatar de tigunn
 
Homme
Développeur de bug
Inscription : janvier 2003
Messages : 565
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Développeur de bug

Informations forums :
Inscription : janvier 2003
Messages : 565
Points : 607
Points : 607
J'ai résolu mon problème ainsi:
Code :
1
2
3
4
5
6
7
8
9
$_XQUERY1 = 'declare namespace dbp="http://dossiers-flaubert.ish-lyon.cnrs.fr/ns/1.0";
let $doc := doc("/db/ma_base/g...-ver3.xml")
for $fragment in $doc//*:div[@*:type="fragment"]|$doc//*:item[@*:type="fragment"]
	return <record><fragment>{$fragment[@n="1"]}</fragment></record>';
 
$result1 = $db->executeQuery($_XQUERY1);
 
$_RESULTID1 = $result1;
$fragment = $db->retrieve($_RESULTID1, 0);
__________________
"le rhume distillation - L’estomac est la cucurbite, le cerveau le chapiteau, & le nez le réfrigérant par lequel s’écoule goutte à goutte le produit de la distillation."
de Avicenne

Le monde se divise en deux: ceux qui utilisent le tag et les autres.

Un problème? venez en découdre!
tigunn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 11h41   #4
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 078
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 078
Points : 10 300
Points : 10 300
Envoyer un message via Skype™ à thelvin
C'est bien pour dépanner, mais une idée intéressante serait d'apprendre les namespaces en XML. Ce n'est pas difficile, pas peur, pas peur.

- Je ne connais pas grand-chose aux BDD XML, mais j'ai du mal à croire qu'il soit si compliqué de trouver le vrai, bon, namespace des balises <div> et <item>. Bon, après, on peut trouver qu'il est plus court de noter *:item que rss:item. C'est possible. Les risques de problème sont assez faibles.

- type étant un attribut, nous pouvons voir dans ton exemple qu'il n'a pas de préfixe, donc pas de namespace.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h04.


 
 
 
 
Partenaires

Hébergement Web