Bonjour,
Pouvez-vous me dire comment générer un fichier XML à partir d'un fichier plat en entrée ?? J'utilise la version 11.5.
Merci.
Bonjour,
Pouvez-vous me dire comment générer un fichier XML à partir d'un fichier plat en entrée ?? J'utilise la version 11.5.
Merci.
il faut que tu fasses un fichier XSL décrivant la structure de ton fichier XML
Ensuite tu crées un job qui contient un dataflow qui prend en entrée ton fichier CSV (précédement créé sous forme de format) et qui fais un mapping (avec l'objet Query) vers ton fichier XML
Tu ne peux pas générer un XML sans en avoir décrit la structure avant
Concernant le XSL, tu veux parler d'un fichier XSD (ou XML Schema) ? Car si c'est une XSD, c'est bon elle est créée.
Pour ce qui est du fichier CSV en entrée et de l'objet Query, c'est ok également.
J'arrive à générer un fichier XML qui ne correspond pas du tout au nombre de valeurs que j'ai en entrée (une sorte de produit cartésien XML!!!).
Comme mon XML a plusieurs niveaux, dois-je mettre autant de fois mon fichier source en entrée pour réaliser le mapping ? En fait, je n'arrive pas à voir comment réaliser le mapping entre mon fichier plat et le XML.
Effectivement je parlais de XSD
Par contre, je ne comprends pas vraiment ton problème, si tu mets plusieurs fois ton fichier en entrée sans rien mettre dans une clause "Where", tu auras effectivement un produit cartésien
Le fichier XML peut poser des problèmes du fait de la vision "hiérarchique" du fichier, mais tu n'as besoin que d'un fichier en entrée, le mapping est simplement un peu complexe, il faut prendre le focus sur le bon niveau de ton noeud puis faire ton mapping, puis passer au noeud précédent
Merci pour tes conseils, j'ai effectivement réalisé le mapping avec un seul fichier en entrée. Mais le résultat n'est toujours pas celui attendu. Il ne prend pas du tout en compte la hiérarchie du fichier XML. Il répète les données autant de fois qu'elles sont présentes dans le fichier pour chaque Tag. J'ai 10 lignes dans mon fichier CSV avec logiquement 1 seule valeur pour le tag du 1er niveau et je me retrouve en sortie avec 10 éléments identiques de 1er niveau (et le même type de répétition pour les autres niveaux).
J'ai essayé avec une DTD et là je me retrouve en sortie avec 1 seul niveau et le tag contient la concaténation des 10 valeurs de mon champ cible !
J'ai la version 11.5 de BODI, n'est-elle pas buguée pour la génération des XMLs ?
Car je retourne le problème dans tous les sens et toujours rien de concluant.
Le traitement ne semble pas si complexe que ça, juste une transformation. J'ai bien mappé mes champs et rempli le "From" pour l'ensemble des niveaux. Faut-il faire autre chose, car là je sèche ....
D'après les tests que j'ai pu faire (je n'utilise pas de fichiers XML en général)
Tu dois avoir un fichier cible de la forme :
ce qui revient à avoir dans ton mapping quelque chose comme ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <racine> <element> <info1>truc</info1> <info2>machin</info2> </element> <element> <info1>chose</info1> <info2>bidule</info2> </element> </racine>
D'après ce que j'ai pu voir, quand tu mets le focus sur "Info1", il ne te met pas le schéma source
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Query element info1 Texte info2 Texte
En fait, c'est du au fait que, pour Data Integrator, chaque niveau de ton fichier XML est géré indépendamment des autres
La solution que j'ai trouvé, mais elle peut ne pas s'appliquer à ton exemple est de modifier la structure de ton fichier XML de façon à n'avoir qu'un élément en dessous de la racine et que tes informations soient stockées sous formes d'attributs dans ton élément
ce qui te donnerait un fichier cible de la forme :
L'autre solution est de générer une table temporaire comprenant la même hiérarchie que ce que tu utilises sur ton fichier cible
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <racine> <element info1='truc' info2='machin'/> <element info1='chose' info2='bidule'/> </racine>
Pour ce que j'ai pu lire dans les docs de formation éditeur, BODI n'est pas vraiment conçu pour écrire des fichiers XML, il sait les lire et ça suffit dans la plupart des cas
En effet, la solution de modifier la structure du fichier de sortie n'est pas vraiment adéquate .
Pour ta solution de passer par une table temporaire, tu veux en venir où ? Car j'ai essayé de passer par des tables mais je bloque toujours lors de la génération de mon XML cible.
Soit DI me génère un XML avec un seul niveau (pourquoi ???). Il s'arrête dès le 1er niveau.
Au mieux, j'ai réussi à obtenir une structure basique avec 1 valeur par tag et par niveau avec un "Template XML" et un "Row Generation" (exemple trouvé sur le forum BOB).
Je pense que je vais finir par repasser par du bon vieux code pour générer mon arbre XML ... On avez espoir d'utiliser l'ETL pour éviter le code et profiter de sa maniabilité, mais à priori notre XML est un peu compliqué pour BODI.
L'idée que j'avais en tête était de recréer ta hiérarchisation dans une table temporaire.
en découpant tes données, tu devrais pouvoir recréer la hiérarchie de ton fichier xml dans des tables intermédiaires, il te suffirait ensuite de copier ta table construite dans ton fichier XML.
Par contre, il est nécessaire que le SGBD que tu utilises gère les nested tables pour permettre ce genre de choses (SQL-Server 2005 ne le fait pas).
Je suis désolé de ne pas pouvoir t'aider beaucoup plus, mais je n'utilise pas du tout BODI de cette façon, et visiblement, il n'a pas été pensé pour le faire non plus .
J'ai aussi eu ce probleme de produit cartesien dans mes xml, avec BODI et j'ai galéré pour trouver la solution, le post date un peu mais ca pourra tjr servir à d'autres:
Il faut simplement ne pas mettre dans les "from" de niveau inferieurs la table parente et bien faire les jointures avec elle dans les tables fils ex:
une table "element" et une table "info" que l'on souhaite imbriquer:
Dans le niveau "element" remplir le "from" normalement et rien ds le where.
Dans le niveau "info" juste mettre la table "info" dans le from, et mettre dans le where la jointure entre "element" et "info".
(J'avais plusieurs tables et pas un seul fichier, il faut donc dans ce cas, peut etre eclater au prealable le fichier csv en une table "element" et une "info" avec un id vers "element")
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager