Problème de navigation dans les nœuds avec XML Schema

21-12-2013 à 20:04:19
Bonsoir.

J'utilise BaseX et lorsque je souhaite me balader dans les nœuds (en utilisant la syntaxe XPath, avec XQuery) je n'arrive pas à me diriger dans l'arbre en utilisant le nom des nœuds.
J'ai remarqué que ce problème n'avais lieu que si on laissé le fichier entries.xsd, et que le problème n'avais plus lieu si on le retirait du fichier XML.

Voici l'instruction que j'utilise pour me diriger vers un nœuds (en tant qu'exemple) :
for $x in doc('src/model/entries_hotels.xml')/entries/entry[1] return $x

En revanche, en utilisant cette syntaxe, la direction vers le nœuds souhaité marchait correctement :
for $x in doc('src/model/entries_hotels.xml')/*[1]/*[1] return $x

J'ai peut être mal compris comment utiliser XPath lorsqu'on inclus un fichier XML Schema, mais je ne trouve pas cette remarque dans le cours.
Pouvez vous m'aider s'il vous plait?

Merci.
  • Liens sponsorisés



23-12-2013 à 10:57:00
Bonjour,

Quand tu utilises :

for $x in doc('src/model/entries_hotels.xml')/entries/entry[1] return $x

tu essayes d'accéder aux noeuds d'élément <entries> puis <entry>, or il n'y en a pas.
En revanche, il existe les éléments <{http://ref.otcnice.com/webservice/}entries> et <{http://ref.otcnice.com/webservice/}entry>, ce qui n'est pas la même chose (j'utilise cette notation pour mentionner que ces éléments sont dans un espace de nom, mais je rappelle que cette écriture est illégale dans un document XML).

J'imagine qu'il manque à ta requête une simple déclaration d'espace de nommage par défaut.

Pour info :

Le schéma n'y est pour rien. Mais je soupçonne que tu as retiré plus que le schéma, à savoir la déclaration d'espace de nom. En clair, si tu remplaces :

<entries xmlns="http://ref.otcnice.com/webservice/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:SchemaLocation="http://ref.otcnice.com/webservice/entries.xsd">

par

<entries>

ça marche !
Mais comme indiqué plus haut, ce n'est pas la solution à adopter : il suffit d'ajouter à la requête XQuery la déclaration d'espace de nom appropriée.

Attention :

Notez qu'on ne vous demande pas de retirer la déclaration d'espace de nom de ce document puisque vous ne traiteriez plus les mêmes éléments, vous devez donc utiliser le fichier tel quel.

Utilisation de doc()

Il n'y a qu'un seul document dans la BD, alors une requête globale c'est à dire sans la fonction doc() devrait marcher.
Essaye de remplacer :

for $x in doc('src/model/entries_hotels.xml')/entries/entry[1] return $x

par :

for $x in /entries/entry[1] return $x