Shell, générer fichier xml à partir de base de données oracle

Fermé
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 - Modifié par Decon le 16/04/2014 à 10:15
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 - 17 avril 2014 à 17:46
Bonjour,

La question en elle même est simple.

Je souhaite générer un fichier xml à partir d'une base de données oracle via un script shell.
En gros dans mon shell, je me connecte à la bd oracle, récupère les données et alimente suivant la structure de mon xml ses différents champs.

Exemple de structure du fichier xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<cible>
<liste>
<ligne>Champ1 ligne 1</ligne>
<ligne>Champ1 ligne 2</ligne>
<ligne>Champ1 ligne 3</ligne>
<!--...-->
<!--...-->
</liste>
</cible>
<GO>
<seq>1</seq>
<Op>
<seq>2</seq>
<toto>
<action>M</action>
<PN>champ3</PN>
<IC>champ4</IC>
<St>
<statut>blabla2</statut>
</St>
<At>
<IdA>Val1 passée en param au script shell</IdA>
<VS>Val2 passée en param au script shell</VS>
<Ac>S</Ac>
</At>
</toto>
</Op>
</GO>

Merci d'avance.

A voir également:

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
16 avril 2014 à 10:37
Salut,

<IdA>Val1 passée en param au script shell</IdA>
<VS>Val2 passée en param au script shell</VS>

Ce sont les seules valeurs à changer dans ton fichier xml ?
A quoi ressemble tes données récupérées depuis la base de données ?
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
16 avril 2014 à 16:39
Non,

Val1 passée en param au script shell
sont des valeurs que je passe en paramètre à mon script shell. Elles me permettront par la suite de modifier d'autres valeurs. Mais là n'est pour l'instant pas la question.

ChampX 
sont les données que je récupère en base. Elles sont de type string.

Là je n'ai mis que quelques un à titre d'exemple.

Je pense que les données en elles même ne sont pas importantes, vu que je débrouille pour ne récupérer que celles dont j'ai besoin.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
16 avril 2014 à 17:26
Ok.

Pour ce genre de truc, j'ai l'habitude de générer un fichier template, avec les des valeurs nominatives, qui me sert à générer le fichier final en opérant des substitutions sur les valeurs.

Exemple :

$ cat template.xml 
<?xml version="1.0" encoding="ISO-8859-1"?>
<cible>
<liste>
<ligne>Champ1 ligne 1</ligne>
<ligne>Champ1 ligne 2</ligne>
<ligne>Champ1 ligne 3</ligne>
<!--...-->
<!--...-->
</liste>
</cible>
<GO>
<seq>1</seq>
<Op>
<seq>2</seq>
<toto>
<action>M</action>
<PN>champ3</PN>
<IC>champ4</IC>
<St>
<statut>blabla2</statut>
</St>
<At>
<IdA>Val1 passée en param au script shell</IdA>
<VS>Val2 passée en param au script shell</VS>
<Ac>S</Ac>
</At>
</toto>
</Op>
</GO>

$ sed 's/Champ1/VAR1/;s/champ3/VAR3/;s/champ4/VAR4/' template.xml > final.xml

$ cat final.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<cible>
<liste>
<ligne>VAR1 ligne 1</ligne>
<ligne>VAR1 ligne 2</ligne>
<ligne>VAR1 ligne 3</ligne>
<!--...-->
<!--...-->
</liste>
</cible>
<GO>
<seq>1</seq>
<Op>
<seq>2</seq>
<toto>
<action>M</action>
<PN>VAR3</PN>
<IC>VAR4</IC>
<St>
<statut>blabla2</statut>
</St>
<At>
<IdA>Val1 passée en param au script shell</IdA>
<VS>Val2 passée en param au script shell</VS>
<Ac>S</Ac>
</At>
</toto>
</Op>
</GO>
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
17 avril 2014 à 16:13
Je crois qu'un sed ne suffira pas pour ce que je veux faire.

Soit ma requête:
select champ1, champ2, ... champN from table where ...

Cette requête me retourne plusieurs lignes, d'où les
<liste>
<ligne>Champ1 ligne 1</ligne>
<ligne>Champ1 ligne 2</ligne>
<ligne>Champ1 ligne 3</ligne>
<!--...-->
<!--...-->
</liste>
Ligne 1, 2, ..., N étant les numéro de ligne. Ce qui veut dire que le bloc <liste> contient les champs 1 de chaque ligne.

Ensuite, en fonction de la valeur du champ2, le bloc <toto> sera construit différemment.

Exemple:

Si champ2 = X
Alors bloc sous la forme:
<toto>
<action>M</action>
<PN>champ3</PN>
<IC>champ4</IC>
<St>
<statut>blabla2</statut>
</St>
<At>
<IdA>Val1 passée en param au script shell</IdA>
<VS>Val2 passée en param au script shell</VS>
<Ac>S</Ac>
</At>
</toto>

Sinon si champ2 =Y
Alors bloc sous la forme:
<toto>
<action>R</action>
<PN>champ3</PN>
<IC>champ4</IC>
<St>
<statut>blabla2</statut>
</St>
</toto>

Sinon
<toto>
<action>S</action>
<PN>champ3</PN>
<IC>champ4</IC>
<Stt>champ5</Stt>
<St>
<statut>blabla2</statut>
</St>

</toto>

Autrement dit une boucle sur le résultat de la requête et un bloc <toto> différent suivant la valeur du champ2.

Merci d'avance.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
17 avril 2014 à 16:57
Effectivement, ce n'est pas gagné ;-(

Donc, oui une boucle va s'imposer. À partir de là, construire plusieurs templates en fonction de tes besoins, et les appeler selon la valeur de ton champ, non ?
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
17 avril 2014 à 17:46
Oui
0