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 :

Premiers pas avec BaseX pour requetes web


Sujet :

XQUERY/SGBD XML

  1. #1
    Nouveau membre du Club
    Premiers pas avec BaseX pour requetes web
    Bonjour ,

    J'espère que je poste bien au bon endroit.
    Voilà mon objectif : utiliser basex pour faire des requêtes web et ensuite les stocker en base de données

    Mon (mes !) problème(s) sont multiples. Je n'arrive pas à tout comprendre dans la doc baseX :

    1) la déclaration de "namespace" (ça sert à quoi ? que faut-il y mettre ?)
    2) Le formulaire : il fonctionne sur le site w3 mais ici il bloque sur le point après var x.
    3) si je veux envoyer les résultats de ma requête sur une autre page : comment dois-je faire ?


    Voici mon code. Merci pour vos conseils, explications, bref pour tout
    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
     
    declare
    	module namespace page = "http://www.mapage.fr"
    	%rest:path("/")
    	%output:method('html')
     
    	function page:accueil() as element (html)
    	{
    	<html>
    		<head>
    			<script>
    				function validateForm() {
    					var x = document.forms["myForm"]["fname"].value;
    					if (x == null || x == "") 
    						{
    						alert("Name must be filled out");
    						return false;
    						}
    				}
    			</script>	
    		</head>
    		<body>
    			<form name="myForm" onsubmit="return validateForm()" method="post">
    				Name: <input type="text" name="fname">
    				<input type="submit" value="Submit">
    			</form>
    		</body>
    	</html>
    	};

  2. #2
    Membre émérite
    1) la déclaration de "namespace" (ça sert à quoi ? que faut-il y mettre ?)
    Elle n'a que l'intention de donner un nom (d'une fonction ou méthode dans ce cas) pleinement qualifié, en théorie unique au sens d'un uri. Si au début ça n'a pas été pleinement apprécié, laissez-le comme tel pour plus tard.

    2) Le formulaire : il fonctionne sur le site w3 mais ici il bloque sur le point après var x.
    C'est à cause des erreurs syntactiques, pas seulement là mais bien à d'autres lieux aussi. Je peux les lister exhaustivement ou presque ci-dessous.
    [1] Il faut mettre le mot clé declare après la ligne "module namespace ...".
    [2] La ligne "module namespace ..." doit forcément terminer par un point-virgule.
    [3] Les deux balises Input doient fermées pour être bien-formées au sens de xml. (<input type=... />)
    [4] Ici l'erreur mentionnée : il faut souligner le contenu de l'élément script étant CDATA. On peut faire ça par exemple.
    Code xquery :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <script>
        <![CDATA[
        function validateForm() {
            //etc etc
        }
        ]]>
    </script>

    3) si je veux envoyer les résultats de ma requête sur une autre page : comment dois-je faire ?
    Il faut lire la documentation, évidemment; c'est trop général.

  3. #3
    Nouveau membre du Club
    Bonjour et merci Tsuji pour ta réponse,

    effectivement en dehors des problèmes de syntaxe, je n'aurais jamais trouvé la solution n°4 .

    Concernant la dernière partie de ma question, je vais tenter d'être plus claire : mon formulaire "myForm" me permet de saisir une chaine de caractères associée à "fname", par exemple "valeur1", puis si je recommence l'opération : "valeur2"...
    Ces valeurs sont ensuite utilisées par une autre fonction pour obtenir des informations spécifiques $info = "info1" puis "info2, etc.

    Y a-t-il une méthode simple (pour que je la comprenne ) pour 1) créer une base de données "dbtest" 2) l'alimenter au fur et à mesure du type :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <resultat>
        <valeur1>info1</valeur1>
        <valeur2>info2</valeur2>
    </resultat>


    Est-ce qu'on peut adapter quelque chose du type :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    let $database := 'dbtest'
    db:store("test",/mabase, $info)


    merci pour vos conseils

  4. #4
    Membre émérite
    Y a-t-il une méthode simple (pour que je la comprenne ) pour 1) créer une base de données "dbtest" 2) l'alimenter au fur et à mesure ...
    Oui, on veuille bien et il faut le faire ,,, Pourtant, si vous voulez, il s'agit un peu deux types de fonctionalité qui se séparent. L'une, qui est restxq propre où on doit faire communiquer les infos en dialoguant entre le serveur et le client; et puis, l'autre, quelques opérations sur une bd, type basex ou non, que ce soit cuid ou d'autres, peu import, en profitant les infos transmises et reçues entr'eux. La deuxième fonctionalité, probablement plus au genre xquery, ne concerne pas restxq au premier lieu et il vous faut la regarder indépendament. Pour la première, je peux faire un effort en donnant un peu plus pour vous de réfléchir et pour que vous avez au moins quelque chose pour en partir.

    Suppose qu'on veut passer deux valeurs, valeur1 et valeur2 vers le serveur. On peut modifier l'example comme ça :
    [1] La forme, gardant la méthode post, on fait une action, dit, /checkthemout.
    Code text :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <form name="myForm" onsubmit="return validateForm()" method="post" action="/checkthemout">
        First Name: <input type="text" name="fname" />
        Last Name: <input type="text" name="lastname" />
        <input type="submit" value="Submit" />
    </form>

    [2] Modifiez validateForm() selon le besoin. Je la garde comme telle. (Il vaut mieux mettre return true; à la fin quand même.)
    [3] Bon, l'url de requête soit mappé à /checkthemout. Voyez comment faire. Dans le module, ajoutez une autre méthode commençant par une autre "declare".
    Code text :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    declare
        %rest:path("/checkthemout")
        %restOST
        %rest:form-param('fname', "{$firstname}")
        %rest:form-param('lastname', "{$lastname}")
        %output:method('xml')
        function page:process($firstname as xs:string, $lastname as xs:string?) as element(resultat) {
            (: quelques opérations db comme on souhaît faire ..., je fais un simple echo pour un démo 
            <resultat>
                <valeur1>{$firstname}</valeur1>
                <valeur2>{$lastname}</valeur2>
            </resultat>
        };


    Voilà et c'est fait.

    ps: edité un peu des noms de variable/méthode.

  5. #5
    Nouveau membre du Club
    Merci Tsuji pour votre réponse

    Pour bien comprendre le code proposé :
    - à la place de "checkthemout" je peux mettre n'importe quoi ? A l'origine j'avais /form à cet endroit là. Est-ce que ça indique la page où on envoie les résultats ?
    - à quoi sert le "as element(resultat)" ? Parfois, j'obtiens la même chose que cette partie du code soit présente ou pas.

    J'arrive à afficher les résultats sous forme XML, je progresse

    Mais si dans la même fonction je transfère les données dans ma base de données basex je ne peux plus avoir cet affichage.
    Je pensais créer une 2e fonction qui récupèrerait les résultats de la 1e fonction pour conserver l'affichage dans le navigateur.
    Mais je ne peux pas réutiliser les résultats obtenus dans une fonction comme paramètres dans une autre (je ne sais pas si c'est très clair ). Est-il possible d'avoir des variables globales ?
    L'idéal serait à la fois d'avoir l'affichage des résultats et leur insertion en base de données.

    J'ai aussi un problème avec l'insertion en base de données : ma database contient les balises <root></root> .
    Ensuite, quand les données sont stockées dans la base de données, au lieu de s'intercaler entre les balises <root>, elles sont ajoutées après la balise fermante </root>. J'ai tenté le "insert as last" mais ça ne fonctionne pas non plus.
    Y a-t-il une façon de préciser le noeud sur lequel on veut stocker l'info avec db:add ?


    Merci pour toute info et bonne soirée

  6. #6
    Membre émérite
    - à la place de "checkthemout" je peux mettre n'importe quoi ? A l'origine j'avais /form à cet endroit là. Est-ce que ça indique la page où on envoie les résultats ?
    A la place de "checkthemout", oui, on peut mettre n'importe quoi tout en respectant la formation d'un url pour une resource sur le serveur. Est-ce que c'est une page où on soumet une forme, ça dépend de la sémantique. /form serait mappé par une annotation; vers où on se finalement tombe dépend le mécanisme d'engin de "dispatching" qui se cache cette info privée, encapsulée si c'est le mot, peu importe.

    - à quoi sert le "as element(resultat)" ? Parfois, j'obtiens la même chose que cette partie du code soit présente ou pas.
    Il serve à faire de codage du type fort pour optimiser le procès algorithmique; mais ça peut pour le plupart du temps être un peu l'avantage sur la papier seulement pour beaucoup (de cas) mais qu'il puisse devenir bien réel quand l'engin est schéma-conscient et le procès soit data intensifs ... et je passe pour ne pas dire des bêtises involontaires. Par défaut, ça peut être item()* ou du genre --- il faut (re-)lire la documentation pour être très sûr, evidemment et c'est pas un secret.

    Pour le reste, je dirais vous devrez poser les questions bien précises dans les postes différents. Je prends toujours une opinion négative sur des postes longs et sans efforts bien focalisants ou je perds l'intérêt vite, mais ce n'est qu'une opinion à moi seul. Que diriez-vous ?

  7. #7
    Nouveau membre du Club
    Bonjour Tsuji,

    Merci pour votre réponse Je vais me repencher sur le problème et "découper" mes futures questions dans de prochains post en fonction de ça. Encore merci pour votre aide et bon week end